2016-03-17 57 views
-1

比方說,我有一個像下面[(LName, FName, Credits)]其中元組的列表:Haskell如何將元組列表中的一列中的值相加,'「按2個元素進行分組?

type LName = String 
type FName = String 
type Credits = Int 

如何我總結由LNameFName兩個分組一個人的所有學分?我發現了一個函數,可以用於[(String, Int)]格式的元組列表,但是我無法使用格式[(String, String, Int)]

這是我對這個討論Working with list of tuples發現功能:

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) 

我想我不能得到它,因爲函數映射的工作或解壓縮。

+0

只是轉換'[(LName的,FName參數被改寫, Credits)]''到'[(String,Int)]',然後使用上面的函數.... lambda和map會爲你做這個。 – jamshidh

+0

@jamshidh謝謝我會盡力做那樣的事!你的意思是LName ++ FName來獲得一個字符串? – Caro

+0

您也可以將其轉換爲((LName,Fname),Credits)。這是一個兩元素元組,其中第一個元素也是一個二元元組。然後你可以匹配第一個元素。 –

回答

3

我不確定我是否完全理解您的問題,但您可以嘗試Data.Functionon功能。

你原有的功能可以使用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) 
+0

那就是我正在尋找的,謝謝! – Caro

相關問題