reduce y folds en Clojure
Pedidos de pan de una panadería plegados con reduce, incluso hacia un mapa.
;; reduce folds a two-argument function across a collection
(def loaves [4 9 2 7])
(println (reduce + loaves))
;; an init value seeds the accumulator and covers the empty case
(println (reduce + 100 loaves) (reduce + 0 []))
(def orders [{:item "rye" :loaves 4} {:item "sour" :loaves 9}
{:item "rye" :loaves 2}])
;; reducing into a map: fnil supplies the 0 the first time a key lands
(def per-item
(reduce (fn [acc {:keys [item loaves]}]
(update acc item (fnil + 0) loaves))
{} orders))
;; min and max fall out of reduce given the right two-argument fn
(println per-item (reduce min loaves) (reduce max loaves))
Cómo funciona
(reduce + loaves)pliega sin valor inicial, y(reduce + 0 [])muestra qué cubre uno inicial.per-itemreduce los mapas de pedido a un mapa de totales, donde(fnil + 0)pone el cero la primera vez.(reduce min loaves)y(reduce max loaves)sacan los extremos del mismo fold.
Palabras clave y builtins usados aquí
deffnmaxminprintlnreduce
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 614
- Tokens
- 110
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 94 segundos.
Paso 2 de 3 en Secuencias; paso 14 de 27 en Fundamentos del lenguaje.