我正在通过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'
提前致谢。
答案 0 :(得分:3)
你错了。您的代码可以读取:
(==) (Hello v) (Hello v') = v = v' -- note the @v = v'@
或
(==) (Goodbye b) (Goodbye b') = b = b' -- same problem
或可能两者。
你的第二个问题是胡说八道。您可以在那里定义任何变量名称,而不仅仅是v
和v'
。
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