[英]Define EQ Instance
我正在尝试创建一个 Eq 实例,但在创建它时遇到了一些问题。
我有以下数据定义:
data Link = G | S | P deriving (Eq, Show)
data Chain = Empty | Join Link Chain
现在我想将 Chain 转换为 Eq 实例(相同时为真)。
这是我当前的实例:
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.==
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.