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

创建Haskell的Chain类型Eq Instance遇歧义错误,求协助

解决自定义Chain类型Eq实例的歧义问题

错误原因

在手动定义Chain的Eq实例时,编译器无法明确a == c中调用的==操作符所属类型:当前作用域同时存在正在定义的Chain类型==(类型为Chain -> Chain -> Bool)和Link类型的==(类型为Link -> Link -> Bool),尽管a、c是Link类型,但编译器仍出现推导歧义,导致报错。

解决方法

方法1:修正手动实例代码(添加类型注解消除歧义)

通过给a == c的结果添加类型注解,或者给a、c指定Link类型,让编译器明确调用Link的==操作符:

instance Eq Chain where
  (Join a b) == (Join c d) = (a == c :: Bool) && (b == d)
  Empty      == Empty      = True
  _          == _          = False

或者直接指定变量类型:

instance Eq Chain where
  (Join (a :: Link) b) == (Join (c :: Link) d) = (a == c) && (b == d)
  Empty                == Empty                = True
  _                    == _                    = False

方法2:直接派生Eq实例(推荐)

由于Chain是递归结构,Haskell可以自动派生符合需求的Eq实例,无需手动编写。派生的实例会递归比较结构:Empty仅与Empty相等,Join构造的Chain会先比较第一个Link是否相等,再递归比较后续的Chain部分,完全满足“两个值相同时返回True”的要求:

data Link = G | S | P deriving (Eq, Show)
data Chain = Empty | Join Link Chain deriving (Eq, Show)

内容的提问来源于stack exchange,提问作者RLP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:35:25