Функція зменшення функції Perl 6 та метаоператор скорочення дають різні результати


12
my @s=<1 2 3 2 3 4>;
say reduce {$^a < $^b}, @s;
say [<] @s;
# --------
# True
# False

Моє запитання двояке: По-перше, чому метаоператор скорочення обробляє <оператора інакше? Схоже, метаопція зменшення оцінюється за допомогою змінної, яка при першій зміні від істинного до помилкового зберігає цю зміну, оскільки:

say [\<] @s;
# ----------
# (True True True False False False)

По-друге, я також хотів би використовувати це всередині функції зменшення, тобто введення деякого коду всередині фігурних дужок функції зменшення, щоб він дав такий же результат, як мета оператор скорочення. Як я можу це зробити? Дякую.

Відповіді:


17

І мета-оператор, і reduceвраховують передану їм оперативність; у випадку <оператора - ланцюг.

Під час проходження користувальницького блоку reduceне можна побачити всередині нього, і тому він повертається до типово ліво-асоціативного; Потім вона порівнює пізніші значення з булевими поверненими з редуктора, які нумізуються на 0або 1, тому результат закінчується як Trueв кінці.

Ви можете отримати семантику, яку ви бажаєте, оголосивши свою функцію зменшення як ланцюгову асоціативність:

my @s1 =<1 2 3 2 3 4>;
my @s2 =<1 2 3 4>;
sub my-reducer($a, $b) is assoc('chain') {
    $a < $b
}
say reduce &my-reducer, @s1;    # False
say reduce &my-reducer, @s2;    # True
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.