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 EmptyshouldBeEmpty全程没有出现任何携带具体值的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
相关产品推荐
相关产品推荐

