【发布时间】:2014-08-12 23:40:06
【问题描述】:
我只是在学习 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
【问题讨论】:
-
另一个问题:
deriving Eq是否尝试做与我的代码完全相同的事情?我无法很好地解释deriving的工作原理。 -
是的,确实如此。请参阅official language report。
标签: haskell instance ambiguous