foldRight
Reduce del último elemento al primero: la contraparte asociativa por la derecha de fold.
Lección
Para un paso asociativo — +, max, concatenar
cadenas — la dirección da igual y
fold es todo lo que necesitas. Para
todo lo demás, decide la respuesta. fold anida desde la
izquierda, así que [1, 2, 3] con una resta es
((0 - 1) - 2) - 3; foldRight anida desde la
derecha y da 1 - (2 - (3 - 0)).
El uso natural es construir algo que envuelve: una estructura anidada, una cadena de decoradores, una lista enlazada donde cada paso tiene que sostener el resto del resultado. Escritas como fold por la izquierda, esas cosas salen del revés.
El reductor conserva el orden de argumentos
(acc, elemento) de fold en lugar del volteo del
foldr de Haskell, así que el mismo callback sirve en ambas
direcciones y puedes cambiar uno por otro sin reescribirlo.
foldRightWithIndex informa de la posición de cada elemento en
la fuente, así que el último elemento llega primero
llevando el índice más alto: el mismo número que
foldWithIndex le habría dado a
ese elemento. El recorrido invertido deliberadamente no se
renumera 0, 1, 2: un índice que significa cosas distintas en operadores
distintos es peor que uno que cuenta hacia atrás.
Ambos son estrictos donde fold no lo es. Caminar hacia atrás
exige saber dónde está el final, así que una fuente que no sea
List se materializa primero y foldRightAsync
vacía el stream antes de empezar: nunca lo apuntes a una fuente infinita.
Demo 1 · La dirección cambia la respuesta
Demo 2 · Con el índice, y asíncrono
Pruébalo tú
Ejercicio: describe un pipeline como llamadas anidadas, empezando por el paso más externo.
fold — la misma reducción desde la izquierda ·
reduce — con semilla en el primer elemento ·
foldWithIndex — el fold por la izquierda con posiciones ·
reverse — la otra forma de caminar hacia atrás