You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:27:00