假设我们有一个坐标列表,如:
(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的程序。
答案 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')