模糊发生'=='

时间:2014-06-23 01:22:58

标签: haskell instance ambiguous

我只是在学习Haskell,并且仍在努力弄清楚事情是如何运作的。

所以我正在创建一个列表类,它可以包含IntChar的混合。

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.==,那么编译就可以了。

我不明白为什么编译器在这里遇到这么多困难。在每种情况下,xy都明确定义为IntChar。我已经将我正在做的事情与众多的教程示例(例如http://www.haskell.org/tutorial/classes.html)进行了比较,我无法确定编译器在这种情况下为什么会这么混蛋:P

1 个答案:

答案 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给你这种结构上的平等。