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?
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. –