Курс 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 тест за змістом цієї теми.
Навігація курсом
← Тест — Оператор послідовності | Тест — Ліниві послідовності →
💪 Або перейдіть одразу до вправ цього розділу.