Haskell中如何用Data.Map统计列表元素出现次数且不使用fromList?
解答
完全可以使用Data.Map实现列表元素出现次数统计,也完全可以不借助fromList函数完成需求。
实现核心思路是通过折叠操作遍历列表,逐个更新计数Map:元素不存在时插入初始计数1,元素已存在时对应计数加1。
完整实现代码
首先导入依赖:
import qualified Data.Map as Map import Data.Map (Map)
通用计数函数实现,支持所有实现了Ord类型类的元素(包含Int、Char等常见类型):
countOccurrences :: Ord a => [a] -> Map a Int countOccurrences = foldl (\acc x -> Map.insertWith (+) x 1 acc) Map.empty
如果需要严格匹配题目要求的[Int] -> Map Int Int类型,直接使用上述函数即可,类型系统会自动适配。
代码说明
- 全程没有用到
fromList函数,从空MapMap.empty开始构建结果 Map.insertWith (+) x 1 acc逻辑:如果当前元素x在Mapacc中不存在,直接插入键值对x:1;如果已存在,将已有值和1做加法实现计数+1- 输出结果中出现的
fromList是Data.Map类型的默认序列化打印格式,不代表代码中调用了该函数
运行示例
-- 统计整数列表 countOccurrences [1,2,2,3,3,3] -- 输出:fromList [(1,1),(2,2),(3,3)] -- 统计字符列表 countOccurrences "abbbc" -- 输出:fromList [('a',1),('b',3),('c',1)]
内容的提问来源于stack exchange,提问作者champ0774
相关产品推荐
相关产品推荐

