typestar

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

  1. (reduce + loaves) pliega sin valor inicial, y (reduce + 0 []) muestra qué cubre uno inicial.
  2. per-item reduce los mapas de pedido a un mapa de totales, donde (fnil + 0) pone el cero la primera vez.
  3. (reduce min loaves) y (reduce max loaves) sacan los extremos del mismo fold.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Secuencias; paso 14 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →