Haskell:计算列表中每对相邻元素的差异

SPG*_*SPG 2 haskell list

我有一个返回浮点列表的函数(mergeall).我想计算此列表中每对相邻元素的差异.例如:

[1.1,2.2,3.3,4.4,5.5,6.6]
do 1.1-2.2, 2.2-3.3,3.3-4.4...
return list of all difference
Run Code Online (Sandbox Code Playgroud)

所以,这应该传递到列表并返回一个列表.问题是:

  1. 我怎样才能使用"mergeall"中的列表?
  2. 我怎么能做上面的算法?有人能帮帮我吗?谢谢!

Lil*_*ard 8

differences fs = zipWith (-) fs (tail fs)
Run Code Online (Sandbox Code Playgroud)

  • @JeffBurdges实际上,涉及一些提升 - 特别是涉及`(e - >)`monad.函数组合`(.)`在这里没有完全删除它,因为在不同的地方提供了两次相同的参数. (6认同)
  • 我不能说pointfree版本更具可读性. (5认同)
  • 或者是无点版本:`differences = ap(zipWith( - ))tail` (4认同)
  • 啊,'ap = liftM2($)`这里将函数应用程序提升到它的第一个参数`zipWith( - )`的第二个参数,但是没有混乱`tail`并且monad规定所有函数都适用于相同的值.可爱.:) (4认同)
  • @augustss:这就是为什么我提供它作为评论而不是作为答案的一部分.我发现看到各种功能的无点版本很有趣,但它们往往更加迟钝. (2认同)
  • 顺便说一句,如果你想要相反的差异(例如`2.2-1.1`),pointfree版本看起来像`zipWith( - )= << tail` (2认同)
  • @JeffBurdges:是的,我花了一段时间来讨论`(e - >)`monad是如何工作的.我仍然觉得要求[pointfree](http://hackage.haskell.org/package/pointfree)实用程序为我生成这些表达式更快,但至少现在我可以很容易地阅读它们. (2认同)