Clojure: ленивая последовательность и обычная последовательность

В чем разница между "обычной" последовательностью и ленивой последовательностью в Clojure?

Посмотрите на эту ссылку: https://clojuredocs.org/clojure.core/partition#partition-by

В нем говорится, что функция "partition" возвращает ленивую последовательность. Как сделать следующую последовательность «ленивой»?

((0 1 2 3) (4 5 6 7) (8 9 10 11) (12 13 14 15) (16 17 18 19))


person CrazySynthax    schedule 31.01.2016    source источник
comment
Что вы читали о ленивых последовательностях, которых не понимаете?   -  person jmargolisvt    schedule 01.02.2016
comment
Возможный дубликат Как в Clojure реализованы ленивые последовательности?   -  person jmargolisvt    schedule 01.02.2016
comment
REPL обычно реализует небольшие ленивые последовательности, такие как ваша, и при любом использовании будет реализовано, по крайней мере, столько же, сколько вы видите. Рассмотрим (partition 4 (range)) - бесконечную ленивую последовательность, в которой у вас есть первые пять элементов. В LightTable вы можете пролистывать столько информации, сколько захотите.   -  person Thumbnail    schedule 01.02.2016


Ответы (1)


user> (time (def lazy-partition (partition 3 (range 1000000)))) "Прошедшее время: 0,165415 мсек"

user> (time (def eager-partition (doall (partition 3 (диапазон 1000000))))) "Прошедшее время: 2181,272597 мсек"

Обычно последовательности в clojure ленивы. Это означает, что они фактически не оценивают последовательность, пока не потребуются данные, обратите внимание, как разбиение возвращается мгновенно. Второй использует doall для принудительной оценки, обратите внимание, что на выполнение требуется более двух секунд.

person Seth Paulson    schedule 01.02.2016
comment
В ПОРЯДКЕ. Но почему первая функция работает так быстро? Что имеет значение, КОГДА данные оцениваются. В обоих случаях оцениваются одни и те же данные. Нет ? - person CrazySynthax; 02.02.2016
comment
Нет. Первый не оценивался. По этой причине я использовал def вместо того, чтобы просто набирать код в REPL, потому что в противном случае REPL автоматически реализовал бы seq, чтобы показать его вам. Если после ввода первой команды вы просто набрали lazy-partition в REPL, то REPL будет вынужден оценить его, чтобы отобразить его вам, а затем займет полные 2 секунды. - person Seth Paulson; 02.02.2016