Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Функциональное программирование / Ленивые и бесконечные последовательности

Бесконечные последовательности

Замените конечное значение на *, и последовательность станет бесконечной — у неё не будет последнего элемента. Поскольку список ленив, это совершенно безопасно: ничего не вычисляется, пока вы это не возьмёте.

say (1, 2, 4 ... *).head(5); # (1 2 4 8 16)

Ряд степеней двойки продолжается вечно, но .head(5) вытягивает лишь первые пять. Простейшая бесконечная последовательность — диапазон 1..*, все целые числа начиная с единицы:

say (1..*).head(3);          # (1 2 3)
say (1..*).map(* ** 2).head(4); # (1 4 9 16)

Последовательность можно определить даже через её собственные предыдущие элементы. Ряд Фибоначчи, где каждое число — сумма двух предыдущих, знаменито записывается в одну строку:

my @fib = 1, 1, * + * ... *;
say @fib[^10]; # (1 1 2 3 5 8 13 21 34 55)

Замыкание * + * берёт два предыдущих элемента и складывает их. Хранить последовательность в @fib здесь можно, потому что оператор ... помечает её как ленивую, и массив не пытается вычислить её целиком: производятся только те десять элементов, которые запрошены через @fib[^10].

Правило простое: бесконечная последовательность безопасна, пока вы вытягиваете из неё лишь конечный срез.

Практика

Пройдите 1 тест по содержанию этой темы.

Навигация по курсу

Тест — Оператор последовательности   |   Тест — Ленивые последовательности


💪 Или перейдите сразу к упражнениям этого раздела.