Сокращение и сокращение позволяют вам накапливать состояние по последовательности. Каждый элемент в последовательности изменяет накопленное состояние до тех пор, пока конец последовательности.
Каковы последствия вызова сокращения или сокращения в бесконечном списке?
(def c (cycle [0]))
(reduce + c)
Это быстро вызовет OutOfMemoryError. Кстати, (reduce + (cycle [0]))
не бросает OutOfMemoryError (по крайней мере, не на время, которое я ожидал). Он никогда не возвращается. Не знаю, почему.
Есть ли способ вызвать сокращение или сокращение в бесконечном списке таким образом, который имеет смысл? Проблема, которую я вижу в приведенном выше примере, состоит в том, что в конечном итоге оцениваемая часть списка становится достаточно большой, чтобы переполнять кучу. Возможно, бесконечный список не является правильной парадигмой. Сокращение по генератору, потоку ввода-вывода или потоку событий будет иметь больше смысла. Значение не должно сохраняться после его оценки и использования для изменения состояния.