Perl 6 riduce la funzione e la riduzione del metaoperatore danno risultati diversi


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

La mia domanda è duplice: in primo luogo, perché il metaoperatore di riduzione elabora il file < operatore in modo diverso? Sembra che il metaop di riduzione stia usando una variabile che, al primo cambio da vero a falso, mantiene tale cambiamento perché:

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

In secondo luogo, vorrei usarlo anche all'interno della funzione di riduzione, ovvero introdurre del codice all'interno delle parentesi graffe della funzione di riduzione in modo che fornisca lo stesso risultato del meta operatore di riduzione. Come posso farlo? Grazie.

Risposte:


17

Sia il meta-operatore che reducetengono conto dell'associatività dell'operatore passato a loro; in caso di< , l'operatore sta concatenando.

Quando passa un blocco personalizzato, reducenon può vedere al suo interno, e quindi ricade sul valore predefinito di associativo di sinistra; confronta quindi i valori successivi con il valore booleano restituito dal riduttore, che numera in 0o 1, motivo per cui il risultato finisce comeTrue alla fine.

Puoi ottenere la semantica che desideri dichiarando la tua funzione di riduzione incatenata all'associatività:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.