Reduce y las reducciones le permiten acumular el estado en una secuencia. Cada elemento en la secuencia modificará el estado acumulado hasta el al final de la secuencia se alcanza.Clojure: reducción, reducciones y listas infinitas
¿Cuáles son las implicaciones de reducir llamadas o reducciones en una lista infinita?
(def c (cycle [0]))
(reduce + c)
Esto arrojará rápidamente un OutOfMemoryError. Por cierto, (reduce + (cycle [0]))
no arroja un OutOfMemoryError (al menos no por el tiempo que esperé). Nunca regresa No estoy seguro por qué.
¿Hay alguna manera de llamar a reducción o reducciones en una lista infinita de una manera que tenga sentido? El problema que veo en el ejemplo anterior es que, finalmente, la parte evaluada de la lista se vuelve lo suficientemente grande como para desbordar el montón. Tal vez una lista infinita no es el paradigma correcto. La reducción de un generador, secuencia de E/S o una secuencia de eventos tendría más sentido. El valor no debe mantenerse después de que se haya evaluado y utilizado para modificar el estado.
Gracias. Tiene sentido. En el primer caso, puedo llamar a la primera c y eso evaluará el primer elemento en la lista infinita, que permanecerá en la memoria. Si llamo las primeras veces suficientes, la parte evaluada de la lista infinita se volverá demasiado grande y el montón se desbordará. En el segundo caso, la parte evaluada se descarta continuamente. Por cierto, en el segundo caso, el montón nunca se desbordará porque la suma de ceros sigue siendo cero. – yalis
buen punto en el bit de los ceros. Quería mencionar que clojure 1.2 y 1.3 son diferentes a este respecto, supongo que es bueno estar equivocado :) –