gpt4 book ai didi

clojure - 将函数列表应用于值

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:52 25 4
gpt4 key购买 nike

我正在寻找在 Clojure 中(实际上在整个 Lisp 世界中)可能定义得很好的东西,但我没有足够的经验或文化来走上正确的轨道,而 Google 也不是很好到目前为止很有帮助。

假设我有三种简单的形式:

(defn add-one   [v] (+ v 1))
(defn add-two [v] (+ v 2))
(defn add-three [v] (+ v 3))

为方便起见,它们存储在一个向量中。在现实世界中,该向量会因上下文而异:

(def operations
[add-one
add-two
add-three])

而且我还有一个初始值:

(def value 42)

现在,我想将该向量中的所有函数应用于该值并获得组合操作的结果:

(loop [ops operations
val value]
(if (empty? ops)
val
(recur (rest ops)
((first ops) val))))

虽然这确实有效,但令我惊讶的是没有专门用于此的更高级别的表单。我找遍了所有地方,但找不到任何东西。

最佳答案

您要搜索的功能短语是(apply comp operations) :

((apply comp operations) 42)
;48

如果你喂它,你的循环确实工作42对于 value :

(loop [ops operations
val 42]
(if (empty? ops)
val
(recur (rest ops)
((first ops) val))))
;48

这会以与 comp 相反的顺序应用操作.

... 与使用 reduce 一样:

(reduce (fn [v f] (f v)) 42 operations)
;48

如果您查看 comp 的源代码,你会发现一般情况本质上是执行一个 loop类似于你的 reverse d 提供的函数列表。

关于clojure - 将函数列表应用于值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com