我正在寻找一种干净,惯用的方式在Clojure中进行“向后缩减”。
我有
(def fns '(fn1 fn2 fn3))
(def val 42)
我想获得(fn3 (fn2 (fn1 val)))
,而且我对这个订单并不挑剔。所以我想连续地将一系列函数应用于一个值,而不是连续地将一系列值应用于函数。
连连呢?谢谢!
答案 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))
)
))