定义EQ实例



我正在尝试创建一个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==cb==d定义现在是模糊的:这是指Prelude.==还是Ch.==?

最新更新