哈斯克尔地图的总结

atl*_*tis 5 haskell map

是否有一个标准函数来汇总Haskell映射中的所有值.我的地图读取的内容有[(a,2),(b,4),(c,6)]?

基本上我要做的是归一化频率分布.因此,上图中键的值是a,b,c的计数.我需要将它们标准化为[(a,1/6),(b,1/3),(c,1/2)]

ehi*_*ird 4

您可以简单地执行Map.foldl\' (+) 0(或者M.foldl\',如果您将 Data.Map 导入为M)。

\n\n

这与 类似foldl\' (+) 0 . Map.elems,但效率稍高一些。(不要忘记使用foldl或foldr对标准数字类型(Int、Integer、Float、Double等)求和时的撇号\xe2\x80\x94会产生巨大的thunks,这将消耗大量的内存并可能导致您的程序溢出堆栈。)

\n\n

但是,只有足够新的容器版本(>= 0.4.2.0) 才包含Data.Map.foldl\',并且您不应该使用 升级它cabal install,因为它随 GHC 一起提供。因此,除非您使用的是 GHC 7.2 或更高版本,否则foldl\' (+) 0 . Map.elems这是实现此目的的最佳方法。

\n\n

您还可以使用Data.Foldable.sum,它适用于Foldable类型类的任何实例,但仍会在常见数字类型上构建大型 thunk。

\n\n

这是一个完整的例子:

\n\n
normalize :: (Fractional a) => Map k a -> Map k a\nnormalize m = Map.map (/ total) m\n  where total = foldl\' (+) 0 $ Map.elems m\n
Run Code Online (Sandbox Code Playgroud)\n\n

您需要导入 Data.List 才能使用foldl\'.

\n