Map 将一组函数缩减为一个值?

Map 将一组函数缩减为一个值?,map,clojure,functional-programming,Map,Clojure,Functional Programming,我正在寻找一种干净、惯用的方法来在Clojure中进行“向后缩减” 我有 (def fns '(fn1 fn2 fn3)) (def val 42) 我想获得(fn3(fn2(fn1 val)),我对订单并不挑剔。所以我想对一个值连续应用一系列函数,而不是对一个函数连续应用一系列值 建议?谢谢 我也不是一个非常高级的Clojure用户,因此API描述的语言在我看来似乎有点简练和神秘。但鉴于我有限的理解,“->”宏吸引了我的眼球。它通过一系列的“形式”来“线程”一个值x,在我看来,这些形式与您所

我正在寻找一种干净、惯用的方法来在Clojure中进行“向后缩减”

我有

(def fns '(fn1 fn2 fn3))
(def val 42)
我想获得
(fn3(fn2(fn1 val))
,我对订单并不挑剔。所以我想对一个值连续应用一系列函数,而不是对一个函数连续应用一系列值


建议?谢谢

我也不是一个非常高级的Clojure用户,因此API描述的语言在我看来似乎有点简练和神秘。但鉴于我有限的理解,“->”宏吸引了我的眼球。它通过一系列的“形式”来“线程”一个值x,在我看来,这些形式与您所追求的东西非常相似

由于它是一个宏,我不确定你是否可以使用(应用)将它推到你的fn列表中,但我会尝试一下

那么

(defn back-reduce
([firstfunction restfunctions val]
    (if (= restfunctions nil)
        (firstfunction val)
        (back-reduce (car restfunctions) (cdr restfunctions) (firstfunction val))  
    )
))

这只是减少。记住函数也是对象。此外,您仍在按f1、f2等顺序应用函数。 不要被它读作(f4(f3

所以,只要使用一个定期的减少

(reduce #(%2 %1) val functions) 

另一种方式是将其视为功能的组合:

user=> ((apply comp [inc dec inc]) 42)
43

用Clojure写下来的最简单方法是:

((comp fn3 fn2 fn1) 42)

我的智慧来源:而且。由于这是一个宏,您必须定义另一个宏才能应用于它。非常感谢!顺便说一句,我注意到(def-fns’(fn1-fn2-fn3))在这里不起作用,所以有必要使用(def-fns[#'fn1#'fn2#'fn3])。cc:引用的列表给出的是符号,而不是值(函数)符号的计算结果是:这就是引用某物的全部意义。您可以执行
(列出fn1 fn2 fn3)
[fn1 fn2 fn3]
;矢量版本在Clojure中更为惯用。+1我认为这实际上是最好的解决方案,因为它既短又因为reduce往往比大多数其他方法具有更好的性能(在Clojure中进行了大量优化)。我喜欢此解决方案,但我认为您必须反转函数集合。
((comp f1 f2 f3)x)
的计算结果为
(f1(f2(f3 x))
,询问者希望相反。完全正确。问题确实指出:“我对顺序不挑剔”,我认为这意味着它们是可交换的,或者可以任意安排。然而,对于某些函数,顺序当然非常重要((应用comp[/+])1 2)->1/3;;;((应用comp(反向[/+])1 2)->1/2我也非常喜欢这个解决方案,它最终会出现在我的代码中。谢谢!hmmmm看起来不像Clojure代码,因为它有“car”和“cdr”:-)