我正在尝试将以下示例转换为新的 Clojure 1.5 reducers 库:
(reduce max (map inc (range 10)))
;=> 10
当我更改它时 - 我收到以下错误:
(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)
有人可以给我一个正确的解决方案吗?
最佳答案
请注意,当您替换 max
时它会起作用。与 +
.
(r/fold + (r/map inc (range 10)))
; => 55
不同之处在于unlike
+
max
does not have一个没有参数的调用案例。 r/fold
需要组合函数——即max
— 在不带参数的情况下调用时提供标识值。对于 *
它是 1
, 为 +
它是 0
.一个潜在的解决方案是定义一个
max'
充当 max
但是当不带参数调用时,它返回负无穷大— an identity element为 max
功能。(defn max'
([] Double/NEGATIVE_INFINITY)
([& args] (apply max args)))
(r/fold max' (r/map inc (range 10)))
; => 10
使用
r/monoid
可以获得相同的结果功能。(r/fold (r/monoid max #(Double/NEGATIVE_INFINITY)) (r/map inc (range 10)))
如需进一步讨论,请参阅 Reducers - A Library and Model for Collection Processing ,节简单就是机会。
关于map - Clojure reducer 库 - 最大折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14192211/