在一种纯粹的函数式编程语言(如Haskell)或仅以函数式方式使用它的语言(例如clojure)中,假设你有一个整数列表/序列/可枚举集合(大小未知),并且想要生成一个新的列表/序列/可枚举集合,其中包含相邻项目之间的差异,你会怎么做?
在函数式编程中,通常采用“映射”和“累加器”两种方法来解决这类问题。具体而言,在本例中,您可以通过将“map”函数应用于输入列表/序列/可枚举集合中的每个元素,并对相邻元素进行差异计算来获得所需的输出列表/序列/可枚举集合。
下面是一个Clojure示例代码:
```clojure (defn diff [lst] (let [pairs (partition 2 1 lst)] (map #(apply - %) pairs))) ```
该函数接受一个列表 `lst`,并使用`partition`函数将列表拆分为两个一组的子列表,然后将`apply`函数应用于每个子列表上,以计算它们之间的差异。最后,`map`函数将应用于所有这些差异值,以生成输出列表。
需要注意的是,与C#中的“fold”不同,这里使用了Clojure中的“map”和“reduce”函数的组合来实现累加器的效果。这种方法允许我们以一种更为函数式和声明性的方式来处理数据,而不是手动管理状态并进行可变更新。
希望以上翻译对您有所帮助。
在函数式编程中,通常采用“映射”和“累加器”两种方法来解决这类问题。具体而言,在本例中,您可以通过将“map”函数应用于输入列表/序列/可枚举集合中的每个元素,并对相邻元素进行差异计算来获得所需的输出列表/序列/可枚举集合。
下面是一个Clojure示例代码:
```clojure (defn diff [lst] (let [pairs (partition 2 1 lst)] (map #(apply - %) pairs))) ```
该函数接受一个列表 `lst`,并使用`partition`函数将列表拆分为两个一组的子列表,然后将`apply`函数应用于每个子列表上,以计算它们之间的差异。最后,`map`函数将应用于所有这些差异值,以生成输出列表。
需要注意的是,与C#中的“fold”不同,这里使用了Clojure中的“map”和“reduce”函数的组合来实现累加器的效果。这种方法允许我们以一种更为函数式和声明性的方式来处理数据,而不是手动管理状态并进行可变更新。
希望以上翻译对您有所帮助。
diffs = drop 1 . snd . mapAccumL (\x y -> (y, y-x)) 0
。尽管在我看来,在这种特定情况下,使用zipWith的惯用代码更易读。 - Jedai