Con il nuovo clojure 1.7 ho deciso di capire dove posso usare i trasduttori. Capisco quali benefici possono dare, ma non riesco a trovare esempi normali di scrittura di trasduttori personalizzati con spiegazione.Comportamento dei trasduttori Clojure
Ok, ho provato a testare cosa sta succedendo. Ho aperto la documentazione del clojure. E gli esempi usano xf
come argomento. Primo: cosa significa questo xf o xfrom? Questa roba ha prodotto un trasduttore di identità.
(defn my-identity [xf]
(fn
([]
(println "Arity 0.")
(xf))
([result]
(println "Arity 1: " result " = " (xf result))
(xf result))
([result input]
(println "Arity 2: " result input " = " (xf result input))
(xf result input))))
ho preso la denominazione di variabili [result input]
da esempio documentazione. Ho pensato che fosse come nella funzione di riduzione dove la parte result
è ridotta e input
è un nuovo elemento di raccolta.
Così quando faccio (transduce my-identity + (range 5))
ho ottenuto il risultato 10
quello che mi aspettavo. Poi ho letto su eduction
, ma non riesco a capire di cosa si tratta. Comunque ho fatto (eduction my-identity (range 5))
ed ho ottenuto:
Arity 2: nil 0 = nil
Arity 2: nil 1 = nil
Arity 1: nil = nil
(0 0 1 1)
Ogni articolo ha ottenuto duplicato perché mi chiamo xf
in println
dichiarazione. Perché duplicato ogni elemento due volte? Perché mi sono perso? Riceverò sempre zero mentre faccio un'eduzione? Posso inoltrare questo comportamento?
Comunque ho fatto
> (reduce + (eduction my-identity (range 5))
clojure.core.Eduction cannot be cast to clojure.lang.IReduce
Ok, il risultato è un Eduction
che non è riducibile, ma stampato come una lista. Perché non è riducibile? Quando digito (doc eduction)
Ottengo che
Returns a reducible/iterable application of the transducers
to the items in coll.
Non dovrebbe (transduce xform f coll)
e (reduce f (eduction xfrom coll))
più lo stesso?
ho fatto
> (reduce + (sequence my-identity (range 5))
20
Naturalmente ho avuto 20
a causa di duplicati. Ancora una volta ho pensato che dovrebbe essere che (transduce xform f coll)
e (reduce f (sequence xfrom coll))
essere sempre uguale almeno in un esempio così piccolo senza alcun trasduttore stateful. Questo è stupido che non lo siano, o mi sbaglio?
Ok, allora ho provato (type (sequence my-identity (range 5)))
e ottenere clojure.lang.LazySeq ho pensato, che è pigro, ma quando ho provato a prendere il first
elemento clojure calcolato tutta la sequenza in una sola volta.
Quindi la mia sintesi:
1) Cosa significa XF o XForm?
2) Perché ricevo nil
come argomento result
mentre eduction
o sequence
?
3) Potrei essere sempre sicuro che sarà nil
mentre eduction
o sequence
?
4) Che cos'è eduction
e qual è l'idea idiomatica non è riducibile? O se lo è, allora come posso ridurlo?
5) Perché ottengo effetti collaterali mentre sequence
o eduction
?
6) Posso creare sequenze pigro effettive con trasduttori?
1) [clojure.org/transducers](http://clojure.org/transducers) - "La XF trasduttore è una pila di trasformazione ... "; quindi, xf è un trasduttore (o una comp di xfs) che è _not_ una funzione (f) quindi lo si chiama 'xf' – birdspider
1) modifica: dovrebbe averlo formulato come 'e per distinguerlo da una funzione regolare (f) uno lo chiama 'xf' ' – birdspider
Hai domande molto interessanti qui, ma penso che otterrai risposte sempre migliori se estrai domande più piccole da esso. Q "1" potrebbe essere una domanda separata ("Qual è il significato di xf o xform nel contesto dei trasduttori?"), Non ha nemmeno bisogno di un esempio, lo stesso vale per le domande 4 e 6. – nberger