2013-10-07 2 views
-1

У меня есть список кортежей, содержащих intergers.Подсчет списка кортежей

[(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, затем добавить накопленное значение к значению y в кортеже (x, y, z) для всех элементов в list.

+0

Каково значение acc в анонимной функции? – user972183

+0

Это аккумулятор. Когда вы используете 'foldl', он начинается с некоторого значения и сохраняет текущую сумму. В этом случае мы начинаем с 0 (это 0, которое вы видите в объявлении функции). На каждом шаге он вызывает анонимную функцию со значением, накопленным до сих пор, и следующим элементом списка в качестве параметров. Итак, 'acc' - это значение, накопленное до сих пор. – user1118321

0

Если вы не боитесь линз (импортерах Control.Lens) одно решение является

sumsnds = sum . toListOf (traverse . _2) 

Это сумма значения в списке вы получаете, когда вы траверс список кортежи и выберите второй значение в каждом кортеже.

Смежные вопросы