将一个列表映射到另一个列表(在Haskell中,+抽象解决方案) - 'map reduce'?

时间:2010-11-15 17:07:19

标签: function haskell

假设我们有一个坐标列表,如:
    (1,2)
    (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 个答案:

答案 0 :(得分:6)

你可以使用zip用它的尾部压缩列表,你可以获得像[((1,2), (0,3)), ((0,3),(4,1)), ...]这样的对。然后,您可以使用map以其总和替换每对对。或者,您可以在一个函数中使用基本为zipWith + zip的{​​{1}},但为map提供的函数的类型为zipWith,而不是a -> b -> c }:

(a,b) -> c

答案 1 :(得分:1)

您可以编写像这样的通用函数

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')