模糊发生'=='

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.==然后它编译罚款.

我不明白为什么编译器在这里遇到这么多困难.xy明确定义为IntChar在每种情况下.我已经将我正在做的事情与众多教程示例(例如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给你这种结构平等.

  • 使用标签在Haskell中进行编程绝对是可能的*,但在Haskell代码中使用选项卡就像在C中使用所有单字母变量名:它不是*要求*赢得混淆的编程竞赛,但它肯定*有帮助*. (3认同)
  • @StephenDouglasAllen:Haskell中的缩进是花括号和分号的语法糖.查看Haskell报告以获取确切的定义:https://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-210002.7 (2认同)