2014-09-04 16 views
6

In questo blog, "CSP and transducers in JavaScript", l'autore afferma:I trasduttori Clojure sono desiderosi?

In primo luogo, dobbiamo renderci conto che molti array (o da un'altra raccolta) operazioni come map, filter e reverse possono essere definiti in termini di un reduce.

Così then we see un certo numero di implementazioni di questo in Clojure non sono pigri, sono desiderosi:

user> (defn eager-map [f coll] 
     (reduce (fn [acc v] (conj acc (f v))) 
     [] 
     coll)) 
#'user/eager-map 
user> (eager-map inc (range 10)) 
[1 2 3 4 5 6 7 8 9 10] 

La mia domanda è, sono trasduttori Clojure ansiosi?

risposta

14

I trasduttori sono funzioni molto semplici: non hanno la nozione di pigrizia o, in effetti, il modo in cui vengono applicate. Questa è la bellezza dell'idea - con i trasduttori, possiamo separare funzioni come map e filter dalle cose su cui operano.

Quindi, sì, essi possono essere utilizzati per costruire sequenze di pigri, così come i canali e riduzioni. Mentre la chiamata della funzione trasduttore è desiderosa, dipende da qualsiasi cosa tu debba consegnare al trasduttore. Le sequenze pigre possono invogliare pigramente i trasduttori solo mentre vengono consumati mentre i riduttori li usano con entusiasmo per sputare la riduzione.

Si può vedere in the source dove sequence viene utilizzato per costruire una sequenza pigro su una collezione con un trasduttore.

Problemi correlati