Perl 6 réduire la fonction et le méta-opérateur de réduction donnent des résultats différents

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

Ma question est double: premièrement, pourquoi le méta- <opérateur de réduction traite-t-il l' opérateur différemment? Il semble que la métaop de réduction soit estimée à l'aide d'une variable qui, au premier changement de vrai à faux, conserve ce changement parce que:

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

Deuxièmement, j'aimerais aussi utiliser ceci à l'intérieur de la fonction de réduction, c'est-à-dire introduire du code à l'intérieur des accolades de la fonction de réduction afin qu'il donne le même résultat que l'opérateur de méta de réduction. Comment puis-je le faire? Je vous remercie.

Romario
la source

Réponses:

17

Tant le méta-opérateur que la reduceprise en compte de l'associativité de l'opérateur lui sont passés; dans le cas de <, l'opérateur enchaîne.

Lors du passage d'un bloc personnalisé, reducene peut pas voir à l'intérieur de celui-ci, et il revient donc à la valeur par défaut de gauche-associative; il compare ensuite les valeurs les plus récentes au booléen renvoyé par le réducteur, qui numérote en 0ou 1, c'est pourquoi le résultat se termine comme Trueà la fin.

Vous pouvez obtenir la sémantique que vous désirez en déclarant votre fonction de réduction comme ayant une associativité de chaînage:

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
la source