Курс Raku / Розширені / Докладніше про вбудовані типи / Послідовності

Ліниві та нескінченні послідовності

Послідовність не мусить обчислювати всі свої значення одразу. Послідовності Raku є лінивими: кожне значення породжується лише тоді, коли воно справді потрібне. Це дає змогу описати послідовність, яка взагалі не має кінця.

Щоб записати нескінченну послідовність, використайте Inf як кінцеву точку. Візьміть послідовність у дужки, бо ... зв’язується слабше за =:

my $naturals = (1 ... Inf);

Без дужок my $naturals = 1 ... Inf присвоїло б змінній лише 1, а потім побудувало б послідовність саме по собі, — а обчислення нескінченної послідовності без жодного результату підвісило б програму.

Поки що нічого не обчислено. Послідовність видаватиме значення лише тоді, коли ви їх попросите. Метод head бере перші кілька:

say (1 ... Inf).head(5); # (1 2 3 4 5)

Хоч послідовність і нескінченна, породжуються лише перші п’ять чисел. Без лінивості програма, яка спробувала б побудувати всю нескінченну послідовність, ніколи б не завершилася.

Для скінченної послідовності метод tail натомість бере значення з кінця:

say (1 ... 100).tail(3); # (98 99 100)

Саме лінивість дозволяє відокремити опис послідовності від рішення про те, скільки з неї використати.

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

Тест — Оператор ...   |   Непарні числа


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