Haskell快速排序代码报Unresolved top-level overloading错误原因求解
错误原因分析
这个错误是Haskell的单态限制(Monomorphism Restriction) 规则导致的,具体触发条件有两个:
- 你没有给
sort函数显式声明类型签名,编译器需要自动推导类型 - 你采用了变量绑定lambda的写法
sort = \xs -> ...,而非sort xs = ...的带参数函数定义写法,触发了单态限制规则
单态限制规则要求:顶层没有显式参数的绑定,不能自动推导为带类约束的多态类型,必须有足够上下文确定具体类型,否则就会报重载无法解析的错误。
你的sort函数逻辑用到了Ord类的<、>操作符,推导出来的类型本应为Ord a => [a] -> [a],属于带Ord约束的多态类型,但因为写法触发单态限制后编译器不能默认给它多态类型,又没有其他上下文确定参数的具体类型,就抛出了Unresolved top-level overloading错误。
解决方法
有两种简单的修复方案:
- 给函数添加显式类型声明
sort :: Ord a => [a] -> [a] sort = \xs -> case xs of [] -> [] y:ys -> sort[p | p <- ys, p < y] ++ y:sort[p| p <- ys, p > y]
- 改成带显式参数的函数定义写法,避开单态限制
sort [] = [] sort (y:ys) = sort [p | p <- ys, p < y] ++ y : sort [p | p <- ys, p > y]
额外提示:你当前的实现会过滤掉和基准值
y相等的元素,如果要保留重复元素,可以把第二个列表推导的条件改成p >= y。
内容的提问来源于stack exchange,提问作者blueMountain
相关产品推荐
相关产品推荐

