Курс языка программирования 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 тест по содержанию этой темы.
Навигация по курсу
← Тест — Оператор последовательности | Тест — Ленивые последовательности →
💪 Или перейдите сразу к упражнениям этого раздела.