Курс языка программирования Raku / Продвинутый уровень / Операторы / Метаоператоры

Метаоператоры свёртки

Метаоператор свёртки записывается как обычный оператор, заключённый в квадратные скобки, например [+] или [*]. Он берёт список значений и вставляет оператор между каждой парой, сворачивая весь список в одно значение.

Например, [+] складывает все элементы списка:

my @data = 3, 5, 7, 9, 11;
say [+] @data; # 35

Конструкция [+] @data равносильна тому, чтобы выписать оператор вручную:

say 3 + 5 + 7 + 9 + 11; # 35

Точно так же работает любой подходящий инфиксный оператор. С [*] вы получите произведение списка, поэтому применение его к диапазону 1..$n — удобный способ вычислить факториал:

my $n = 5;
say [*] 1..$n; # 120

Здесь диапазон 1..$n порождает числа от 1 до 5, а [*] перемножает их: 1 * 2 * 3 * 4 * 5, то есть 5!.

Конкатенация строк тоже работает. Свёртка [~] соединяет список строк в одну:

my @strings = <neun hundert fünf und zwanzig>;
say [~] @strings; # neunhundertfünfundzwanzig

Свернуть можно даже операторы сравнения. [<] сообщает, идут ли значения строго по возрастанию:

say [<] 1, 2, 3; # True

Треугольная свёртка

Если поставить внутри скобок обратную косую черту, получится треугольная свёртка, которая сохраняет все промежуточные результаты, а не только итоговый:

say [\+] 1..5; # (1 3 6 10 15)

Каждый элемент результата — это частичная сумма: 1, затем 1+2, затем 1+2+3 и так далее вплоть до суммы всего списка.

Практика

Пройдите 1 тест по содержанию этой темы.

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

Метаоператоры   |   Тест — Свёртка


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