按fst过滤并按对的snd计算

pet*_*bal 1 haskell

我想定义函数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)

cdk*_*cdk 6

我用作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)

  • 更好的是:`pointCount = M.toList.M.fromListWith(+)`. (3认同)