7

我正在尝试将以下示例转换为新的 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)

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

4

1 回答 1

12

请注意,当您替换为 时,它会max起作用+

(r/fold + (r/map inc (range 10)))
; => 55

不同之处在于,like+ max 没有不带参数的调用的情况。r/fold需要组合函数——即max——在不带参数调用时提供一个标识值。因为*1,因为+0

一个潜在的解决方案是定义一个max'作为max但当不带参数调用时它返回负无穷大-<a href="https://en.wikipedia.org/wiki/Identity_element" rel="noreferrer">一个身份函数的元素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 ProcessingSimplicity is Opportunity部分。

于 2013-01-07T09:28:53.523 回答