Ste*_*len 7 haskell instance ambiguous
我只是在学习Haskell,并且仍在努力弄清楚事情是如何运作的.
所以我正在创建一个可以包含Int和的混合列表类Char.
data Algebra = Empty
| Nmbr Int Algebra
| Smbl Char Algebra
Run Code Online (Sandbox Code Playgroud)
然后我尝试将它作为一个实例 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
Run Code Online (Sandbox Code Playgroud)
我得到一个 Ambiguous occurrence ==编译错误.它不能告诉之间的区别Main.==和Prelude.==.如果我手动更换所有==有Main.==或Prelude.==然后它编译罚款.
我不明白为什么编译器在这里遇到这么多困难.x并y明确定义为Int或Char在每种情况下.我已经将我正在做的事情与众多教程示例(例如http://www.haskell.org/tutorial/classes.html)进行了比较,我无法确定编译器在这种情况下为什么会出现这样的混蛋:P
Jon*_*rdy 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
Run Code Online (Sandbox Code Playgroud)
否则编译器将其视为两件事:
的instance Eq Algebra一个空体,产生的默认定义a == b = not (a /= b),反之亦然.
名为的新中缀运算符的定义==.
然后==在代码中使用现在会产生==from Eq(定义在Prelude)和==代码(Main)之间的歧义.
是的,deriving Eq给你这种结构平等.