为自定义类型创建Eq类型类的实例

时间:2018-05-01 05:32:24

标签: haskell

我正在通过Chris Allen的Haskell编程手册学习Haskell。需要以下帮助(来自Typeclasses章节的练习题)。 我需要为数据类型创建一个Eq类型类的实例:

data EitherOr a b = Hello a | Goodbye b

但是当我在下面创建它时,我收到一个错误,奇怪地说,"解析输入错误' ='。也许你需要让我们进行阻止。"

instance (Eq a,Eq b) => Eq (EitherOr a b) where
    (==) (Hello v) (Hello v') = v == v'
    (==) (Goodbye b) (Goodbye b') = b == b'

在尝试练习时,我也遇到了以下问题:

data Which a = ThisOne a | ThatOne a

在为两个数据构造函数定义(==)时,我必须为参数(v,v')使用相同的名称。我不明白原因。

instance Eq a => Eq (Which a) where
   (==) (ThisOne v) (ThisOne v') = v == v'
   (==) (ThatOne v) (ThatOne v') = v == v'

提前致谢。

1 个答案:

答案 0 :(得分:3)

你错了。您的代码可以读取:

(==) (Hello v) (Hello v') = v = v'  -- note the @v = v'@

(==) (Goodbye b) (Goodbye b') = b = b'  -- same problem

或可能两者。

你的第二个问题是胡说八道。您可以在那里定义任何变量名称,而不仅仅是vv'

data MyEither a b = Lefty a | Righty b

instance (Eq a, Eq b) => Eq (MyEither a b) where
  (Lefty kumquat)   == (Lefty jebediah) = kumquat  == jebediah
  (Righty superman) == (Righty batman)  = superman == batman