foldRight

Reduce del último elemento al primero: la contraparte asociativa por la derecha de fold.

Acc foldRight<A, Acc>(Acc seed, Acc Function(Acc acc, A a) f, Iterable<A> iterable) Acc foldRightWithIndex<A, Acc>(Acc seed, Acc Function(Acc acc, A a, int index) f, Iterable<A> iterable) Future<Acc> foldRightAsync<A, Acc>(FutureOr<Acc> seed, FutureOr<Acc> Function(Acc acc, A a) f, FxAsyncIterable<A> iterable) Acc Fx.foldRight<Acc>(Acc seed, Acc Function(Acc acc, T a) f) // chain

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.

Relacionado: 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