La función de reducción de Perl 6 y el metaoperador de reducción dan resultados diferentes

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

Mi pregunta es doble: en primer lugar, ¿por qué el metaoperador de reducción procesa al <operador de manera diferente? Parece que el metaop reducción está usando una variable que, en el primer cambio de verdadero a falso, retiene ese cambio porque:

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

En segundo lugar, también me gustaría usar esto dentro de la función reducir, es decir, introducir algún código dentro de los corchetes de la función reducir para que dé el mismo resultado que el meta operador de reducción. ¿Cómo puedo hacerlo? Gracias.

Romario
fuente

Respuestas:

17

Tanto el metaoperador como reducetener en cuenta la asociatividad del operador pasado a ellos; en el caso de <, el operador está encadenando.

Al pasar un bloque personalizado, reduceno puede ver dentro de él, por lo que vuelve al valor predeterminado de left-asociative; A continuación, compara los valores posteriores contra el booleano devuelto desde el reductor, que numifies a 0o 1, lo que es la razón por el resultado termina como Trueen el final.

Puede obtener la semántica que desea declarando que su función de reducción tiene asociatividad de encadenamiento:

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
fuente