2013-01-07 20 views
6

Kütüphaneden yeni Clojure 1.5 düşürücüler için aşağıdaki örneği dönüştürmek için çalışıyorum ile katlanır: Ben BT değiştirmekClojure kütüphane düşürücüler - max

(reduce max (map inc (range 10))) 
;=> 10 

aşağıdaki hatayı alıyorum:

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

Birisi bana doğru bir çözüm verebilir mi?

cevap

10

max'u + ile değiştirdiğinizde çalıştığına dikkat edin.

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

fark gerçektir unlike +maxdoes not have bir bağımsız değişken ile, bir çağrı için bir olgu olduğu. r/fold, birleştirme işlevini gerektirir - örn. max - argümanlar olmadan çağrıldığında bir kimlik değeri sağlamak için. * için 1, + için 0'dur.

olası bir çözüm max olarak hareket eder, ancak, herhangi bir parametre ile çağrıldığında max fonksiyonu için negatif infinity- an identity element döndüren bir max' tanımlamak olacaktır.

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

aynı sonuç

r/monoid fonksiyonu kullanılarak elde edilebilir. daha fazla tartışma için
(r/fold (r/monoid max #(Double/NEGATIVE_INFINITY)) (r/map inc (range 10))) 

Reducers - A Library and Model for Collection Processing bkz bölüm Sadelik Fırsat olduğunu.

+0

Tamam - Google grubunda şu şekilde tartıştıkları anlaşılıyor: https://groups.google.com/forum/?fromgroups=#!searchin/clojure/reduce$20max/clojure/EJ9hOZ8yaos/TULab4pndwoJ – hawkeye

+1

@Jan Bunun için 'monoid 'denilen bir yardımcısı vardır, bunu kullanarak ikinci kod örneğiniz örn. (r/katlama (r/monoid maks # (Çift/NEGATIVE_INFINITY)) (r/harita inc (aralık 10))) –

+0

@EugeneBeresovksy, teşekkürler, 'monoid' işlevi hakkında bilmiyordum. Cevabı güncelledim. – Jan