2013-02-14 2 views
3

У меня есть кортеж, содержащий два списка чисел - ([1,2,3,4], [5,6,7,8])Суммирование соответствующие пары из двух списков в кортеже - в Haskell

Мне нужно суммировать соответствующие пары чисел из каждого списка. т.е. (1 + 5), (2 + 6) и т. д. Вывод списка, т. е. [6,8,10,12]. Он также должен работать для любого количества элементов в списках (2 списка из 5, 2 списка из 6 и т. Д.).

Я пытаюсь использовать функцию, используя «map sum. Transpose», но, похоже, не может получить правильные типы (как внутри кортежа). Я нашел фрагмент кода, который работает для списка списков, но не знаю, как сделать то же самое для кортежей списков (возможно ли это?). Когда я пытаюсь изменить типы «a» или использовать компиляцию Int I для ошибок типа-несоответствия.

tupSums :: Num a => [[a]] -> [a] 
tupSums = map sum . transpose 

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

ответ

10

Это хороший кандидат для zipWith, который принимает два списка и объединяет соответствующие элементы в списке с использованием конкретного оператора. Следующие должны работать:

tupSums :: Num a => ([a],[a]) -> [a] 
tupSums = uncurry $ zipWith (+) 

zipWith (+) вычисляет функцию, которая принимает два аргумента, причем каждый из них списки, и возвращает список попарных сумм. uncurry выполняет функцию двух аргументов и превращает ее в функцию, которая принимает один кортеж. Итак, uncurry $ zipWith (+) оценивает функцию, которая берет кортеж списков и возвращает список с попарной суммой.

+0

Cheers Kevin, это отличная помощь. В основном у меня возникают проблемы с различиями между [a] и [Int], которые вызывают несоответствия типов, когда я выполняю функции. – Worlt

+0

+1, спасибо, что указали мою ошибку. – dreamcrash

+0

@Worlt: 'Int' - это конкретный тип, представляющий целое число. Он также относится к классу «Num», поэтому в любом месте, где ожидается «Num», вы можете использовать 'Int'. Поэтому в типе 'Num a => ([a], [a]) -> [a]' вы можете передать '([Int], [Int])', и вы получите '[Int ] 'назад. Единственное ограничение здесь - конкретный тип всех 3 списков, которые должны быть одинаковыми. Вы не можете передать '([Int], [Integer])', и если вы передадите '([Int], [Int])', вы не сможете получить '[Integer]' back out. –

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