假设我们有一个坐标列表,例如:
(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 的程序。
最佳答案
您可以使用 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)
关于function - 将一个列表映射到另一个列表(在 Haskell 中,+抽象解决方案) - 'map reduce' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4186931/