我想定义函数pointCounts,它获取第一个成员是名称的对列表,第二个是点值,并返回每个名称带有计数点的对的列表.
我挣扎了几天,但我无法想象如何做到这一点.
输入示例应如下所示:
pointCount [("Ferp",25),("Herp",18),("Derp",15),("Ferp",25),("Herp",15),("Derp",18),("Jon",10)]
和期望的输出示例:
[("Ferp",50),("Herp",33),("Derp",33),("Jon",10)]
Run Code Online (Sandbox Code Playgroud)
我用作Data.Map中间数据结构:
import qualified Data.Map as M
pointCount :: Num a => [(String, a)] -> [(String, a)]
pointCount = M.toList . foldr f M.empty
where f (name, val) = M.insertWith (+) name val
-- or pointfree
-- f = uncurry (M.insertWith (+))
Run Code Online (Sandbox Code Playgroud)
甚至更好(正如Daniel Wagner指出的那样)
pointCount = M.toList . M.fromListWith (+)
Run Code Online (Sandbox Code Playgroud)