2017-08-12 2 views
1

J'utilise Clojure 1.8 et je m'attendais à ce que réduire et appliquer soit équivalent à la sortie pour cet exemple particulier.Réduire/Appliquer une discordance

user=> (apply max-key val {:a 2 :bb 1}) 
[:a 2] 
user=> (reduce max-key val {:a 2 :bb 1}) 
[:bb 1] 

Ils semblent ne pas l'être, quelqu'un pourrait-il expliquer pourquoi? Merci

+2

Pourquoi vous les exepct être les mêmes? – Lee

Répondre

3

apply les arguments prepends à l'appel de max-key. reduce - d'autre part - réduit sur {:a 2 :bb 1}, en appelant max-clé avec deux arguments. Le val est traité comme the initial value of the accumulator dans la réduction.

Une forme reduce qui est équivalent à votre apply serait:

(reduce #(max-key val %1 %2) {:a 2 :bb 1}) 
1

(reduce max-key val {:a 2 :bb 1}) utilise max-key comme accumulateur et val comme valeur initiale. Il se développe efficacement dans:

(max-key (max-key val [:a 2]) [:bb 1])) 

(max-key val [:a 2]) est [:a 2] et (max-key [:a 2] [:bb 1])