You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 06:18:02