您可以简单地执行Map.foldl\' (+) 0(或者M.foldl\',如果您将 Data.Map 导入为M)。
这与 类似foldl\' (+) 0 . Map.elems,但效率稍高一些。(不要忘记使用foldl或foldr对标准数字类型(Int、Integer、Float、Double等)求和时的撇号\xe2\x80\x94会产生巨大的thunks,这将消耗大量的内存并可能导致您的程序溢出堆栈。)
但是,只有足够新的容器版本(>= 0.4.2.0) 才包含Data.Map.foldl\',并且您不应该使用 升级它cabal install,因为它随 GHC 一起提供。因此,除非您使用的是 GHC 7.2 或更高版本,否则foldl\' (+) 0 . Map.elems这是实现此目的的最佳方法。
您还可以使用Data.Foldable.sum,它适用于Foldable类型类的任何实例,但仍会在常见数字类型上构建大型 thunk。
\n\n这是一个完整的例子:
\n\nnormalize :: (Fractional a) => Map k a -> Map k a\nnormalize m = Map.map (/ total) m\n  where total = foldl\' (+) 0 $ Map.elems m\n您需要导入 Data.List 才能使用foldl\'.
| 归档时间: | 
 | 
| 查看次数: | 1581 次 | 
| 最近记录: |