我正在尝试创建一个Eq实例,但我有一些问题创建它。
我有以下数据定义:
data Link = G | S | P deriving (Eq, Show)
data Chain = Empty | Join Link Chain
现在我想将Chain转换为Eq实例(当它相同时为True)。
下面是我当前的实例:
instance Eq Chain where
(Join a b) == (Join c d) = (a == c) && (b == d)
Empty == Empty = True
_ == _ = False
它将(a == c) && (b == d)
标记为错误(歧义出现' == ')
我不知道为什么会这样,如果有人能帮助我,我会很感激的。
提前感谢!
缩进方法定义失败。
instance Eq Chain where
↓↓
Join a b == Join c d = a==c && b==d
Empty == Empty = True
_ == _ = False
↑↑
…或者,,但不推荐使用,将它们放在大括号
中instance Eq Chain where {
Join a b == Join c d = a==c && b==d;
Empty == Empty = True;
_ == _ = False
}
如果没有缩进或大括号,你的代码所做的就是声明一个空Eq
实例,以及一个单独的全新的操作符,恰好也称为==
。也就是说,你实际写的是:
module Ch where
instance Eq Chain where
-- missing definitions of `Prelude.==` here
(Ch.==) :: Chain -> Chain -> Bool
Join a b Ch.== Join c d = a==c && b==d
Empty Ch.== Empty = True
_ Ch.== _ = False
编译器错误告诉您a==c
和b==d
定义现在是模糊的:这是指Prelude.==
还是Ch.==
?