繁体   English   中英

使用'=='时没有(Eq a)的实例

[英]No instance for (Eq a) arising from a use of ‘==’

我正在尝试为此数据类型编写Eq实例:

data Tree a b = Leaf b | Node a (Tree a b) (Tree a b)
deriving (Show)

我写了一些我认为可行的简单代码:

instance Eq (Tree a b) where
  (Leaf x) == (Leaf y) =  x == y
  (Node val1 l1 r1) == (Node val2 l2 r2)  =  (val1 == val2) && (l1==l2) && (r1==r2)
  _  == _  = False

但后来我得到了错误:

• No instance for (Eq a) arising from a use of ‘==’
  Possible fix: add (Eq a) to the context of the instance declaration
• In the first argument of ‘(&&)’, namely ‘(val1 == val2)’
  In the expression: (val1 == val2) && (l1 == l2) && (r1 == r2)
  In an equation for ‘==’:
     (Node val1 l1 r1) == (Node val2 l2 r2)
     = (val1 == val2) && (l1 == l2) && (r1 == r2)

我试过添加Eq a => ...但是我得到了类型b的相同错误。 我似乎也无法添加Eq b

任何帮助将不胜感激,10倍!

正如您所写,您必须放置类型约束Eq aEq b 您只需将约束括在括号中并用逗号分隔它们。

instance (Eq a, Eq b) => Eq (Tree a b) where
  (Leaf x) == (Leaf y) =  x == y
  (Node val1 l1 r1) == (Node val2 l2 r2)  =  (val1 == val2) && (l1==l2) && (r1==r2)
  _  == _  = False

您编写了一个实例,您可以在ab的实例上调用(==)函数:

instance Eq (Tree a b) where
  (Leaf x) == (Leaf y) = x == y
  (Node val1 l1 r1) == (Node val2 l2 r2) = (val1 == val2) && (l1==l2) && (r1==r2)
  _  == _  = False

xy您的第一条中的实例a ,和val1val2你的第二个条款中的实例b 不是说你可以比较那些。 例如,你不能检查两个函数的相等性(在计算机科学中根本不可能检查两个函数是否相等)。 因此,在这种情况下,我们永远无法得出两棵树是否相等。

无论如何,Haskell注意到你使用函数(==) :: Eq c => c -> c -> Bool with as operands xy (在第一个子句中),因此需要Eq a 同样的推理适用于第二个子句:我们看到你用两个b实例调用(==) ,因此需要Eq b 我们需要将这些类型约束添加到instance声明中:

instance (Eq a, Eq b) => Eq (Tree a b) where
  (Leaf x) == (Leaf y) = x == y
  (Node val1 l1 r1) == (Node val2 l2 r2) = (val1 == val2) && (l1==l2) && (r1==r2)
  _  == _  = False

因此,您只能检查两棵树的相等性,因为树的ab是作为Eq类型类的实例的类型。 但这是合乎逻辑的,因为如果你可以不比较Leaf的值,那么你怎么能说树是否相等?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM