首页 > 解决方案 > (Eq a) 没有因使用 '==' 而产生的实例

问题描述

我正在尝试为这种数据类型编写一个 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 => ...,但随后我得到 type 的相同错误b。而且我似乎也无法添加Eq b

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

标签: haskelltypeclass

解决方案


正如您所写,您必须放置类型约束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

推荐阅读