dictionary - ¿Los transductores Clojure están ansiosos?
reduce eager-loading (1)
En esta entrada de blog, "CSP y transductores en JavaScript" , el autor afirma:
En primer lugar, debemos darnos cuenta de que muchas operaciones de matriz (u otra colección) como
map
,filter
ereverse
se pueden definir en términos de unareduce
.
Entonces vemos que varias implementaciones de esto en Clojure no son flojas, están ansiosas:
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]
Mi pregunta es, ¿están ansiosos los transductores Clojure?
Los transductores son funciones muy simples: no tienen una noción de pereza o, de hecho, cómo se aplican. Esa es la belleza de la idea: con los transductores, podemos separar funciones como el map
y el filter
de las cosas en las que operan.
Entonces, sí, pueden usarse para crear secuencias perezosas, así como canales y reducciones. Mientras que la función de transductor llamada en sí misma está ansiosa, depende de lo que le de al transductor para llamarlo. Las secuencias perezosas pueden invocar perezosamente los transductores solo mientras se consumen, mientras que los reductores los utilizarán ansiosamente para escupir la reducción.
Puede ver en la fuente donde se usa la sequence
para construir una secuencia floja sobre una colección con un transductor.