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

메신저해야한다고 생각 난 당신이 올바른 궤도에 있다고 생각. 나는 이것을 시도하고 작동하는 것 같다 :

이 0의 값으로 시작 말한다
sumSecondTuple list = foldl (\acc (x, y, z) -> (+) y acc) 0 list 

는 다음 list의 모든 항목에 대한 튜플 (x, y, z)y 값으로 누적 값을 추가합니다.

+0

익명 함수의 값은 얼마입니까? – user972183

+0

누적 기입니다. 'foldl'을 사용하면, 어떤 값으로 시작하여 누적 합계를 유지합니다. 이 경우 0부터 시작합니다 (함수 선언에서 볼 수있는 0입니다). 각 단계에서 지금까지 누적 된 값과 목록의 다음 요소를 매개 변수로 사용하여 익명의 함수를 호출합니다. 따라서 'acc'는 지금까지 누적 된 값입니다. – user1118321

0

당신이 (Control.Lens 가져 오기) 렌즈를 하나 개의 솔루션을 두려워하지 않은 경우는이 목록의 합 값은 당신이 때 의 목록 통과 얻을 것이다

sumsnds = sum . toListOf (traverse . _2) 

입니다 튜플을 선택하고 각 터플에 두 번째 값을 선택하십시오.