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

Haskell自定义List类型拼接函数测试出现歧义类型错误

错误原因

这个错误确实和Empty构造器不携带类型参数a的具体值直接相关,核心是类型歧义:

  • shouldBe断言的类型签名为(Eq a, Show a) => a -> a -> Expectation,要求待比较的两个值必须同时满足Eq和Show类型类约束。你为List a派生的Eq、Show实例,都要求类型参数a本身实现Eq、Show才可以使用。
  • Empty作为List a的构造器,本身是多态的,类型为forall a. List a,可以匹配任意元素类型的List。
  • 最后一条测试用例combineLists Empty Empty shouldBe Empty全程没有出现任何携带具体值的Value构造器,Haskell的类型推导系统无法确定此处List a的类型参数a的具体类型,也就找不到对应的Show实例,因此抛出歧义类型变量a0的错误。

其余测试用例正常运行的原因

其他测试用例中都出现了携带具体值的Value构造器:

  • 例如Value 1 Empty中的数值字面量1默认会被推导为Integer类型,直接确定了List a的参数a为Integer,此时List Integer的Eq、Show实例都是明确存在的。
  • 即便是测试用例中出现的Empty,也会被上下文里已经确定类型的List Integer值同步推导类型,不会出现歧义。

修复方案

只需要给最后一条测试用例中的Empty添加明确的类型注解即可,示例如下:

combineLists Empty Empty `shouldBe` (Empty :: List Int)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:36:03