2013-01-07 30 views
6

我想下面的例子轉換爲新的Clojure 1.5減速機庫摺疊:Clojure的異徑庫 - 有最大

(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) 

有人可以給我一個正確的解決方案嗎?

回答

10

請注意,當您將max替換爲+時,它將起作用。

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

的區別是,unlike +maxdoes not have爲不帶參數調用的情況下。 r/fold需要組合功能 - 即, max - 在沒有參數的情況下調用時提供標識值。對於*它是1,對於+它是0

一個潛在的解決方案是定義一個max',它作爲max,但是當不帶參數調用時,它返回max函數的負無窮大-an identity element

(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,部分簡單是機會

+0

好的 - 看起來他們在Google小組中討論過它:https://groups.google.com/forum/?fromgroups=#!searchin/clojure/reduce$20max/clojure/EJ9hOZ8yaos/TULab4pndwoJ – hawkeye

+1

@Jan有一個叫做'monoid'的助手,使用它,你的第二個代碼示例就減少到了例如'(r/fold(r/monoid max#(Double/NEGATIVE_INFINITY))(r/map inc(range 10)))' –

+0

@EugeneBeresovksy,謝謝,我不知道'monoid'函數。我已經更新了答案。 – Jan