Курс 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 тест за змістом цієї теми.

Навігація курсом

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


💪 Або перейдіть одразу до вправ цього розділу.