Курс языка программирования 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)

Ленивость позволяет отделить описание последовательности от решения о том, какую её часть использовать.

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

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


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