Perl 6 funkcja redukcji i metaoperator redukcji dają różne wyniki

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

Moje pytanie jest dwojakie: po pierwsze, dlaczego metaoperator redukcji przetwarza <operatora inaczej? Wygląda na to, że metaop redukcji jest szacowany przy użyciu zmiennej, która przy pierwszej zmianie z prawdy na fałsz zachowuje tę zmianę, ponieważ:

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

Po drugie, chciałbym również użyć tego wewnątrz funkcji zmniejszania, tj. Wprowadzenia kodu w nawiasach klamrowych funkcji zmniejszania, aby dawał taki sam wynik jak meta operator redukcji. Jak mogę to zrobić? Dziękuję Ci.

Romario
źródło

Odpowiedzi:

17

Zarówno metaoperator, jak i reduceuwzględniające przekazane mu skojarzenie operatora; w przypadku <operatora łańcuchowy.

Po przejściu bloku niestandardowego reducenie może zobaczyć jego wnętrza, więc wraca do domyślnego ustawienia lewostronnego; następnie porównuje późniejsze wartości z wartością logiczną zwróconą z reduktora, która numeruje do 0lub 1, i dlatego wynik kończy się tak jak Truena końcu.

Możesz uzyskać pożądaną semantykę, deklarując funkcję redukcji jako powiązaną z łańcuchem:

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
Jonathan Worthington
źródło