Haskell编写列表最高频元素查找函数遇map参数报错如何解决?
问题原因及修正方案
核心错误点
map的传参逻辑错误:map要求传入两个参数,第一个是作用于列表每个元素的映射函数,第二个是待遍历的列表。你当前的写法是直接将lambda函数传入occur (sort xs)的返回值完成调用,把这个调用结果作为map的唯一参数,完全不符合map的语法要求,这就是触发参数相关报错的直接原因。- 函数返回值类型不匹配:你声明的
task函数返回类型为a(列表元素类型),但你现有逻辑如果修完参数问题,得到的是[(a, Int)]类型的配对列表,和声明的返回类型不符,还需要补充按次数取最大值的逻辑。
修正示例
如果你要保留用occur函数的思路,结合标准库的最大值比较函数,修改后的代码如下:
import Data.List (sort, maximumBy) import Data.Ord (comparing) -- 你已实现的occur函数,功能如你描述 occur :: Eq a => [a] -> [(a, Int)] occur = undefined -- 你的实现逻辑放在这里 task :: Eq a => [a] -> a -- 先得到元素-次数配对列表,再按次数取最大值,最后取出对应的元素 task xs = fst $ maximumBy (comparing snd) (occur $ sort xs)
如果不想依赖标准库的maximumBy,也可以自行遍历配对列表,比较每个元素的次数字段取最大值即可。
内容的提问来源于stack exchange,提问作者m.18
相关产品推荐
相关产品推荐

