Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Функційне програмування / Конвеєри даних

Ланцюжки конвеєрів

Справжня цінність потоків з’являється тоді, коли етапів кілька. Кожен ==> передає свій результат наступній операції, тож увесь конвеєр читається згори вниз у тому порядку, у якому відбувається робота:

(1..10)
    ==> grep(* %% 2)
    ==> map(* ** 2)
    ==> my @result;

say @result; # [4 16 36 64 100]

Простежте дані вниз сторінкою: почни з 1..10, залиш парні числа, піднеси кожне до квадрата й збери результат. Парні числа — це 2, 4, 6, 8, 10, а їхні квадрати — 4, 16, 36, 64, 100.

Записаний як ланцюжок методів, той самий конвеєр має вигляд (1..10).grep(* %% 2).map(* ** 2) — і читається він зліва направо, точно як потік. Ланцюжок методів не вивернутий навиворіт; він виконує свої етапи в тому самому порядку. Формою, що справді читається навиворіт, є вкладання операцій як звичайних функцій — map(* ** 2, grep(* %% 2, 1..10)), де доводиться починати з найглибшого виклику й рухатися назовні.

Отже, потік — це не спосіб утекти від вивернутого коду, а інше написання конвеєра, що читається зліва направо. Що він додає, так це розкладку: кожен етап ==> може стояти на власному рядку, і один оператор однаково працює як для кроків у стилі методів, так і для кроків у стилі функцій, а це тримає довгий конвеєр легким для огляду. Зрештою потоки та ланцюжки методів роблять ту саму роботу; обирайте те, що робить конкретне перетворення найзрозумілішим.

Практика

Виконайте 1 тест за змістом цієї теми.

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

Тест — Оператор конвеєра   |   Тест — Конвеєри


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