2016-03-12 18 views
5

Una versione leggermente modificata del reduce è stata introdotta con reducers, clojure.core.reducers/reduce (short r/reduce):Qual è lo scopo di clojure.core.reducers/reduce?

(defn reduce 
    ([f coll] 
    (reduce f (f) coll)) 
    ([f init coll] 
    (if (instance? java.util.Map coll) 
    (clojure.core.protocols/kv-reduce coll f init) 
    (clojure.core.protocols/coll-reduce coll f init)))) 

r/reduce differisce dalla sorella nucleo solo in quanto utilizza (f) come valore iniziale quando non viene fornito, e delega per core reduce-kv per le mappe.

Non capisco cosa possa essere un tale speciale scopo speciale reduce e perché valesse la pena includerlo nella libreria dei riduttori.

Stranamente, r/reduce non è menzionato nei due post introduttivi del blog per quanto posso dire (first, second). Note sulla documentazione ufficiale

In generale, la maggior parte degli utenti non chiamerà direttamente r/riduci e preferirà invece r/fold (...) Tuttavia, potrebbe essere utile eseguire una riduzione desiderosa con meno risultati intermedi.

Non sono sicuro di ciò che l'ultima frase suggerisce.

Quali situazioni possono gestire r/reduce che il core riduce? Quando potrei raggiungere r/reduce con convinzione?

+0

Sembra che le differenze che hai citato (utilizzando la funzione di riduzione per produrre il valore di init e l'utilizzo di riduci-kv per le mappe) siano le uniche. Penso che possiamo ipotizzare che l'utilizzo di una versione specializzata per le mappe evita l'overhead di allocazione poiché ogni voce della mappa non deve essere racchiusa in un vettore a 2 elementi, ma viene invece passata direttamente come argomenti separati per ridurre la funzione. –

risposta

3

due possibili ragioni:

  1. Ha diversa - meglio! - semantica di clojure.core/reduce nel caso sequenziale iniziatico. Durante la sua presentazione di Conj del 2014 Rich Hickey ha chiesto "chissà che cosa è la semantica di reduce quando la si chiama con una raccolta e senza valore iniziale?" - follow this link for the exact spot in the presentation - e quindi ha descritto la semantica come "una regola ridicola e complessa" e "una delle cose peggiori che abbia mai copiato da Common Lisp" - cf. Common Lisp's reduce contract. La presentazione riguardava i trasduttori e il contesto dell'osservazione era una discussione su transduce, che ha un contratto superiore, più semplice; r/reduce fa pure.

  2. Anche senza considerare quanto sopra, è una sorta di bello avere una versione di reduce con un contratto molto vicino a quello di fold. Ciò consente di "provare uno, provare l'altro" semplice analisi comparativa con gli stessi argomenti, oltre a cambiare semplicemente la propria mente.