Haskell中为DD类型实现Eq类型类实例时报==不属于DD类错误如何解决
问题解答
核心错误点
- 语法错误:
instance声明格式写错。Haskell中为类型实现类型类的语法是instance 类型约束 => 类型类名 (目标类型) where,你要给DD a实现Eq类型类,正确的声明头应为instance (Eq a) => Eq (DD a) where。你写的instance (Eq a) => DD a where会让编译器误以为你要实现名为DD的类型类,但DD是你定义的数据类型而非类型类,自然不存在==方法,触发报错。 - 重复实例冲突:你定义
DD数据类型时已经在deriving子句中声明了Eq,编译器会自动生成默认的Eq实例,若要手动自定义相等判断逻辑,需要删除deriving中的Eq,否则后续会触发实例重复的报错。
修正代码
首先调整数据类型定义,移除deriving中的Eq:
data DD a = DDNode { var :: Int, vals :: [DD a]} | DDLeaf { val :: a} deriving (Show)
再修正Eq实例声明:
instance (Eq a) => Eq (DD a) where (DDNode i vs) == (DDNode i' vs') = i == i' && vs == vs' (DDLeaf v) == (DDLeaf v') = v == v' _ == _ = False
额外说明
你当前手动实现的Eq逻辑和GHC默认deriving Eq生成的逻辑完全一致,如果没有后续自定义相等判断的需求,直接保留原有deriving (Show, Eq)、删除手动写的instance声明即可正常运行,无需额外编写代码。
内容的提问来源于stack exchange,提问作者Aditya Shinde
相关产品推荐
相关产品推荐

