使用Trees
并定义新的“Eq
”我正在获得"Ambiguous class occurrence 'Eq' *** Could refer to: Hugs.Prelude.Eq Main.Eq".
我知道我正在尝试为前奏的现有Eq-Class添加新定义,但我不想使用导入前置隐藏(Eq),因为我的新等式正在使用“ ==“对于数字类型。运算符被称为“= +”,因为它不是真正的相等(我认为它已经通过派生'加载'),而只是一个结构的。
data Tree = Nil | Node Int Tree Tree deriving (Eq, Ord, Show)
instance Eq Tree where
Nil =+ Nil = true
(Node a tl1 tr1) =+ (Node b tl2 tr2) = (a==b) && (tl1==tl2) && (tl1==tl2)
我会感谢任何建议。
答案 0 :(得分:3)
如果您希望新类与预定义的类共存,您应该明确地给它一个可正确区分的名称,例如。
class PseudoEq x where
(=+) :: x -> x -> Bool
instance PseudoEq Tree where
Nil =+ Nil = true
Node a tl1 tr1 =+ Node b tl2 tr2
= a==b && tl1==tl2 && tl1==tl2
简单地使用Main.Eq
对实例进行限定几乎可以做同样的事情,但是如果它“不是真正的平等”,那么根本调用你的类Eq
会很困惑。
(虽然==
也不需要是正确的相等;对于许多类型,这仅仅意味着“在用户可以观察到的所有方面都相同”。)
答案 1 :(得分:2)
只需使用完全限定的类名:
module Main where
data Tree = Nil | Node Int Tree Tree deriving (Prelude.Eq, Ord, Show)
class Eq a where
(=+) :: a -> a -> Bool
instance Main.Eq Tree where
Nil =+ Nil = True
(Node a tl1 tr1) =+ (Node b tl2 tr2) = (a==b) && (tl1==tl2) && (tl1==tl2)
你不应该在第一时间产生这种歧义。例如,您的Eq
应该被称为StructEq
,如果它是“只是结构性的”。
答案 2 :(得分:0)
如果要编写自定义文件,为什么要派生Eq
?只需从派生子句中删除Eq
,这一切都可以正常工作。