2013-10-07 107 views
-1

我有一個包含整數的元組列表。總結元組列表

[(123,123,123),(123,123,123),(123,123,123)] 

我想獲得列表的所有第二個值的總和例如;

[(_,123,_),(_,123,_),(_,123,_)] 

123 + 123 + 123

我想我應該用摺疊但林不知道

回答

5

從元組列表中提取第二個值以獲取新列表,然後求和新列表。

Prelude> let a = [(123,123,123),(123,123,123),(123,123,123)] 
Prelude> sum [i | (_,i,_) <- a] 
1

我認爲你是在正確的軌道上。我想這和它似乎工作:

sumSecondTuple list = foldl (\acc (x, y, z) -> (+) y acc) 0 list 

此說,開始爲0的值,則累計值的元組(x, y, z)list添加到y值的所有項目。

+0

匿名函數中的acc值是多少? – user972183

+0

這是累加器。當你使用'foldl'時,它以某個值開始,並保持一個總計。在這種情況下,我們從0開始(這是你在函數聲明中看到的0)。在每一步中,它會調用迄今爲止積累的值以及列表的下一個元素作爲參數的匿名函數。所以'acc'是迄今累積的價值。 – user1118321

0

如果你不怕鏡頭(進口Control.Lens)一種解決方案是

sumsnds = sum . toListOf (traverse . _2) 

這將總和值在列表你當你遍歷列表元組,並挑出每個元組中的值。