Comportamiento de los transductores Clojure
Con el nuevo clojure 1.7 decidí entender dónde puedo usar transductores. Entiendo qué beneficio pueden dar, pero no puedo encontrar ejemplos normales de escribir transductores personalizados con explicación.
Ok, traté de probar lo que está sucediendo. Abrí la documentación de clojure. Y hay ejemplos de usoxf
como argumento Primero: ¿qué significa esto xf o xfrom? Esto produjo un transductor de identidad.
(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))))
Tomé el nombre de variables[result input]
del ejemplo de documentación. Pensé que es como en la función reducir donderesult
es parte reducida yinput
Es un nuevo elemento de colección.
Entonces cuando hago(transduce my-identity + (range 5))
Obtuve resultado10
Lo que esperaba. Entonces leí sobreeduction
, pero no puedo entender de qué se trata. De todos modos hice(eduction my-identity (range 5))
y consiguió:
Arity 2: nil 0 = nil
Arity 2: nil 1 = nil
Arity 1: nil = nil
(0 0 1 1)
Todos los artículos se duplicaron porque llamoxf
enprintln
declaración. ¿Por qué duplicó cada elemento dos veces? ¿Por qué tengo nada? ¿Siempre me quedaré sin nada mientras hago una educación? ¿Puedo transmitir este comportamiento?
De todos modos lo hice
> (reduce + (eduction my-identity (range 5))
clojure.core.Eduction cannot be cast to clojure.lang.IReduce
Ok, el resultado es unEduction
eso NO es reducible, sino impreso como una lista. ¿Por qué no es reducible? Cuando escribo(doc eduction)
Lo entiendo
Returns a reducible/iterable application of the transducers
to the items in coll.
No deberia(transduce xform f coll)
y(reduce f (eduction xfrom coll))
¿ser el mismo?
hice
> (reduce + (sequence my-identity (range 5))
20
Por supuesto que tengo20
por duplicados Nuevamente pensé que debería ser eso(transduce xform f coll)
y(reduce f (sequence xfrom coll))
ser siempre igual al menos en un ejemplo tan pequeño sin ningún transductor con estado. ¿Es estúpido que no lo sean o me equivoco?
Ok, entonces lo intenté(type (sequence my-identity (range 5)))
y obtener clojure.lang.LazySeq pensé, que es vago, pero cuando traté de tomar elfirst
El elemento clojure calculó toda la secuencia a la vez.
Entonces mi resumen:
1) ¿Qué significa xf o xform?
2) Por qué me salenil
como unresult
argumento mientraseduction
osequence
?
3) ¿Podría estar siempre seguro de que seránil
mientraseduction
osequence
?
4) Qué eseduction
¿Y cuál es la idea idiomática que no es reducible? O si es así, ¿cómo puedo reducirlo?
5) ¿Por qué tengo efectos secundarios mientrassequence
oeduction
?
6) ¿Puedo crear secuencias perezosas reales con transductores?