让我们考虑一种数据类型,其中有许多构造者:
data T = Alpha Int | Beta Int | Gamma Int Int | Delta Int
我想写一个功能,检查是否与同一建筑商生产两种价值:
sameK (Alpha _) (Alpha _) = True
sameK (Beta _) (Beta _) = True
sameK (Gamma _ _) (Gamma _ _) = True
sameK _ _ = False
维护<条码>sameK不是很幸运的,因此无法轻易加以核对。 例如,如果在<代码>T上添加新的构件,就很容易忘记更新<代码>sameK。 举一个例子:
-- it’s easy to forget:
-- sameK (Delta _) (Delta _) = True
问题是如何避免在<代码>sameK上的碎块? 或如何确保对<代码>T的构件进行核对?
<>m>. 我发现的工作是,为每个建筑商分别使用数据类型,得出<代码>Data.Typeable,并宣布一个共同类型类别,但我不喜欢这一解决办法,因为这个办法远不易读,而只是为我设计的简单的图书馆类型:。
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Typeable
class Tlike t where
value :: t -> t
value = id
data Alpha = Alpha Int deriving Typeable
data Beta = Beta Int deriving Typeable
data Gamma = Gamma Int Int deriving Typeable
data Delta = Delta Int deriving Typeable
instance Tlike Alpha
instance Tlike Beta
instance Tlike Gamma
instance Tlike Delta
sameK :: (Tlike t, Typeable t, Tlike t , Typeable t ) => t -> t -> Bool
sameK a b = typeOf a == typeOf b