Я в настоящее время читаю книгу программирования O'reilly Clojure, который это говорит следующее в это раздел о ленивых последовательностях:Как найти длину ленивой последовательности без принудительной реализации?
Возможно (хотя и очень редко) для ленивых последовательности, чтобы знать его длину, и поэтому возвращайте его в результате подсчета, не понимая его содержимого.
Мой вопрос: как это делается и почему это так редко?
К сожалению, книга не указывает эти вещи в этом разделе. Я лично считаю, что очень полезно знать длину ленивой последовательности до ее реализации, например, на той же странице есть пример ленивой последовательности файлов, которые обрабатываются с помощью функции с использованием map
. Было бы неплохо узнать, сколько файлов может быть обработано до реализации последовательности.
Это, очевидно, не единственный возможный пример. Что относительно '(repeat 1000 x)'? '(диапазон 100)'? Существует много видов ленивых последовательностей, которые * могут * знать их длину, но не имеют его запрограммированного просто потому, что это потребует инженерного времени и имеет накладные расходы на время, вероятно, небольшое преимущество. – amalloy
@amalloy вот почему я сказал «я могу думать», может быть, я должен был добавить «сейчас» в конце :) Еще остальная часть ответа - длина ленивой последовательности известна до ее создания, поэтому нет реальный выигрыш в умном внедрении длины в самой последовательности. – soulcheck
Означает ли это, что невозможно рассчитывать без реализации ленивой последовательности, которая является результатом «фильтра»? Скажем, ленивый seq из нескольких миллионов случайных чисел: '(- >> my-rand-int-lazy-seq (фильтр # (даже?%)) (Count-without-implementation))'? – adamneilson