2013-06-09 3 views
0

Я пытаюсь добавить компонент по компонентам список кортежей с использованием более высоких функций. Результатом должен быть (сумма первого компонента, сумма на втором компоненте).Добавление поэтапного компонента Haskell

sumPointwise :: Num a => [(a,a)] -> (a,a) 
sumPointwise tl = (sumPw1, sumPw2)       -- 42:1 
    where sumPw1 = foldr (\ x y -> (fst x) + (fst y)) 0 tl 
     sumPw2 = foldr (\ x y -> (snd x) + (snd y)) 0 tl 

Но я получаю следующее сообщение об ошибке:

Couldn't match type `a' with `(a, b0)' 
    `a' is a rigid type variable bound by 
     the type signature for sumPointwise :: Num a => [(a, a)] -> (a, a) 
     at .hs:42:1 
In the first argument of `fst', namely `y' 
In the second argument of `(+)', namely `(fst y)' 
In the expression: (fst x) + (fst y) 

Похоже, что лямбда-функция является неправильным. Но я этого не понимаю.

Благодарим за помощь!

ответ

3

Второй аргумент foldr - совокупное значение: foldr :: (a -> b -> b) -> b -> [a] -> b. Таким образом, ваши выражения должны выглядеть

sumPw1 = foldr (\ x s -> (fst x) + s) 0 tl 

Более емким пути решения вашей задачи является

sumPointwise tl = let (xs, ys) = unzip tl in (sum xs, sum ys) 
+3

Ну, если вы ищете емким то, возможно, '(сумма *** сумма). unzip'. –

+0

@ ThomasM.DuBuisson + 'import Control.Arrow' :) – leventov