我们说我有一个元组列表,如下面的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
我认为由于功能映射或解压缩,我无法使其工作。
答案 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)