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 - 用于收集处理的库和模型,简化为机会.
| 归档时间: |
|
| 查看次数: |
1205 次 |
| 最近记录: |