Haskell调用检查空列表的tell函数传[]报类型歧义错误如何修复?
报错原因
这个错误由Haskell的多态类型检查机制触发:
- 空列表
[]本身是多态类型[a],没有额外标注时编译器无法推断泛型参数a的具体类型 - 你的
tell函数带有Show a的约束,即使空列表分支的执行逻辑不会用到show方法,类型检查阶段仍然要求确定存在对应的Show a实例,因此抛出类型变量歧义错误。
修复方案
方案1:调用时给空列表加显式类型注解(最常用)
只需要在调用tell时给空列表指定任意实现了Show类的元素类型即可,例如指定为Int类型:
tell :: (Show a) => [a] -> String tell [] = "The list is empty" tell (x:[]) = "The list has one element: " ++ show x -- 可选:补全多元素分支避免匹配运行时报错 tell xs = "The list has " ++ show (length xs) ++ " elements" main = do putStrLn (tell ([] :: [Int]))
你也可以把[Int]换成[String]、[Bool]等任意带Show实例的类型,都可以正常运行。
方案2:使用类型应用扩展(适合GHC >= 8.0)
开启TypeApplications扩展后,可以直接给泛型参数指定类型,写法更简洁:
{-# LANGUAGE TypeApplications #-} tell :: (Show a) => [a] -> String tell [] = "The list is empty" tell (x:[]) = "The list has one element: " ++ show x main = do putStrLn (tell @Int [])
内容的提问来源于stack exchange,提问作者dangtuan21
相关产品推荐
相关产品推荐

