我只是在学习Haskell,并且仍在努力弄清楚事情是如何运作的。
所以我正在创建一个列表类,它可以包含Int
和Char
的混合。
data Algebra = Empty
| Nmbr Int Algebra
| Smbl Char Algebra
然后我尝试将其设为Eq
instance Eq Algebra where
Empty == Empty = True
(Nmbr x xl) == (Nmbr y yl) = (x == y) && (xl==yl)
(Smbl x xl) == (Smbl y yl) = (x == y) && (xl==yl)
_ == _ = False
我收到Ambiguous occurrence ==
编译错误。它无法区分Main.==
和Prelude.==
之间的区别。如果我用==
或Main.==
手动替换所有Prelude.==
,那么编译就可以了。
我不明白为什么编译器在这里遇到这么多困难。在每种情况下,x
和y
都明确定义为Int
或Char
。我已经将我正在做的事情与众多的教程示例(例如http://www.haskell.org/tutorial/classes.html)进行了比较,我无法确定编译器在这种情况下为什么会这么混蛋:P
答案 0 :(得分:10)
您需要缩进instance
定义的正文:
instance Eq Algebra where
Empty == Empty = True
(Nmbr x xl) == (Nmbr y yl) = (x == y) && (xl==yl)
(Smbl x xl) == (Smbl y yl) = (x == y) && (xl==yl)
_ == _ = False
否则编译器将其视为两件事:
instance Eq Algebra
一个空体,生成a == b = not (a /= b)
的默认定义,反之亦然。
名为==
。
然后在您的代码中使用==
现在会在==
Eq
(在Prelude
中定义)和代码中的==
之间产生歧义( Main
)。
是的,deriving Eq
给你这种结构上的平等。