减少一组值的函数?

时间:2009-11-06 20:26:42

标签: map clojure functional-programming

我正在寻找一种干净,惯用的方式在Clojure中进行“向后缩减”。

我有

(def fns '(fn1 fn2 fn3))
(def val 42)

我想获得(fn3 (fn2 (fn1 val))),而且我对这个订单并不挑剔。所以我想连续地将一系列函数应用于一个值,而不是连续地将一系列值应用于函数。

连连呢?谢谢!

5 个答案:

答案 0 :(得分:7)

这只是减少。记住功能也是对象。此外,您仍然按顺序f1,然后f2等应用您的功能。 不要与它读的事实相混淆(f4(f3 ......

所以只需使用常规缩减。

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

答案 1 :(得分:5)

另一种思考方式是作为一种功能组合:

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

答案 2 :(得分:3)

我也不是一个非常先进的Clojure用户,所以API描述的语言往往看起来有点简洁和神秘。但鉴于我的理解有限,“ - >”宏观震撼了我的眼睛。它通过一系列“形式”来表达一个价值x,这看起来与我所追求的相似。

因为它是一个宏,我不确定你是否可以使用(应用)将它推入你的fn列表中,但我会试一试!

答案 3 :(得分:2)

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

((comp fn3 fn2 fn1) 42)

答案 4 :(得分:1)

怎么样......

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