Отображение одного списка в другой (в Haskell, + абстрактное решение) - 'map Reduce'? - PullRequest
2 голосов
/ 15 ноября 2010

Скажем, у нас есть список координат, например:
(1,2) * +1002 * (0,3)
(4,1)
(0,3)
(-2,3)
(6,5)

И мы хотели привести следующий список, который определяется как сумма всех последовательных координат. (Извините за плохое определение) вроде так:
(1,5)
(4,4)
(4,4)
(-2,6)
(4,8)

Итак, существует множество A = (a, b, c, ..., n), где a, b, c, ..., n - координаты в R ^ 2.
Существует функция f такая, что f (A) = B = (a + b, b + c, c + d, ..., n-1 + n).

~

Как бы вы написали что-то подобное на функциональном языке, таком как Haskell? Программа, которая применяет f к заданному A, чтобы дать B.

Ответы [ 2 ]

6 голосов
/ 15 ноября 2010

Вы можете использовать zip, чтобы сжать список хвостом, вы получите пары пар, такие как [((1,2), (0,3)), ((0,3),(4,1)), ...]. Затем вы можете использовать map для замены каждой пары пар на сумму. Или вы можете использовать zipWith, который в основном zip + map в одной функции, за исключением того, что функция, заданная для zipWith, имеет тип a -> b -> c, а не (a,b) -> c:

summedCoords = zipWith (\ (a,b) (c,d) -> (a+c, b+d)) coords (tail coords)
1 голос
/ 17 ноября 2010

Вы можете написать обобщенную функцию, подобную этой

g:: (a -> a -> b) -> [a] -> [b]
g f (x1:x2:xs) = (f x1 x2):(g (x2:xs))
g _ (x1:[]) = []

и передайте свою функцию добавления

f = g f' where 
    f' (a,b) (a',b') = (a+a', b+b')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...