Clojure redurs库 - 最大折叠

haw*_*eye 6 reduce clojure map reducers

我正在尝试将以下示例转换为新的Clojure 1.5 reducer库:

(reduce max (map inc (range 10))) 
;=> 10
Run Code Online (Sandbox Code Playgroud)

当我更改它时 - 我收到以下错误:

(r/fold max  (r/map inc (range 10)))
;ArityException Wrong number of args (0) passed to: core$max  clojure.lang.AFn.throwArity (AFn.java:437)
Run Code Online (Sandbox Code Playgroud)

有人能给我一个正确的解决方案吗?

Jan*_*Jan 10

请注意,当你代替工作max+.

(r/fold + (r/map inc (range 10)))
; => 55
Run Code Online (Sandbox Code Playgroud)

所不同的是,不像+ max 没有对不带参数调用的情况下.r/fold需要组合函数 - 即max- 在没有参数的情况下调用时提供标识值.对于*1,+对它来说0.

一个潜在的解决方案将是,以限定max'其充当max但是当不带参数调用它返回负infinity- 单位元max功能.

(defn max'
  ([] Double/NEGATIVE_INFINITY)
  ([& args] (apply max args)))
(r/fold max'  (r/map inc (range 10)))
; => 10
Run Code Online (Sandbox Code Playgroud)

使用该r/monoid功能可以获得相同的结果.

(r/fold (r/monoid max #(Double/NEGATIVE_INFINITY)) (r/map inc (range 10)))
Run Code Online (Sandbox Code Playgroud)

有关进一步的讨论,请参阅Reducers - 用于收集处理的库和模型,简化为机会.