Haskell自定义drop'函数出现Ambiguous type variable错误求助
Haskell模糊类型变量错误原因及解决方法
错误原因
你的drop'和标准库drop的类型都是Int -> [a] -> [a]。当调用drop' 7 []时,返回的是空列表,但Haskell无法确定这个空列表的具体类型a——空列表[]可以属于任意类型的列表(比如[Int]、[String])。
GHCi能正常执行是因为它有宽松的默认类型推导规则,会自动给模糊的类型变量分配默认值(比如把a默认成()单元类型)。但编译阶段(main函数中)GHC的类型检查更严格,不会自动补全这种未明确的类型,因此抛出Ambiguous type variable ‘a0’错误。
解决建议
- 显式添加类型注解:直接给空列表指定类型,比如:
这样GHC就明确知道这是print (drop' 7 ([] :: [Int]))Int类型的空列表。 - 通过上下文约束类型:如果后续代码中会对这个结果进行特定类型的操作,GHC能自动推断出类型。比如把结果和
[1,2,3]拼接:
此时GHC会自动识别let res = drop' 7 [] print (res ++ [1,2,3])res是[Int]类型。 - 传入非空列表:如果场景允许,直接传入带有具体元素的列表,比如
drop' 7 ["a", "b"],类型会被自动推断出来。
内容的提问来源于stack exchange,提问作者lp1241
相关产品推荐
相关产品推荐

