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