Haskell中的模糊类出现

时间:2014-01-18 17:03:20

标签: class haskell ambiguous

使用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)

我会感谢任何建议。

3 个答案:

答案 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,这一切都可以正常工作。