Haskell如何对元组列表的一列中的值求和,'"按"分组2个元素?

时间:2016-03-17 16:43:49

标签: haskell sum tuples

我们说我有一个元组列表,如下面的type LName = String type FName = String type Credits = Int 其中:

LName

如何汇总FName[(String, Int)]分组人员的所有分数?我找到了一个函数来处理格式为[(String, String, Int)]的元组列表,但我无法使用格式getSumCredits :: [(String, Int)] -> [(String, Int)] getSumCredits = map (foo . unzip) . groupBy (\x y -> fst x == fst y) . sort where foo (names, vals) = (head names, sum vals)

以下是我在此次讨论中发现的功能Working with list of tuples

Namespace

我认为由于功能映射或解压缩,我无法使其工作。

1 个答案:

答案 0 :(得分:3)

我不确定我是否完全理解您的问题,但您可以尝试on中的Data.Function功能。

您可以使用on

重写原始功能
getSumCredits :: [(String, Int)] -> [(String, Int)]
getSumCredits = map (foo . unzip) . groupBy ((==) `on` fst) . sort
   where foo (names, vals) = (head names, sum vals)

你想要的功能(我认为)可以写成

getSumCredits :: [(String, String, Int)] -> [(String, String, Int)]
getSumCredits = map (foo . unzip3) . groupBy ((==) `on` (\(x, y, _) -> (x, y))) . sort            
   where foo (lnames, fnames, vals) = (head lnames, head fnames, sum vals)