Função de redução de Perl 6 e metaoperador de redução fornecem resultados diferentes

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

Minha pergunta é dupla: primeiro, por que o metaoperador de redução processa o <operador de maneira diferente? Parece que o metaop de redução está estimado usando uma variável que, na primeira alteração de true para false, retém essa alteração porque:

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

Em segundo lugar, também gostaria de usar isso dentro da função de redução, ou seja, introduzindo algum código dentro dos colchetes da função de redução, para que ele produza o mesmo resultado que o meta operador de redução. Como eu posso fazer isso? Obrigado.

Romario
fonte

Respostas:

17

O meta-operador e reduceleva em consideração a associatividade do operador passada a eles; no caso de <, o operador está encadeando.

Ao passar um bloco personalizado, reducenão é possível ver dentro dele e, portanto, volta ao padrão de associativo à esquerda; depois, compara os valores posteriores com o booleano retornado do redutor, que numerifica para 0ou 1, e é por isso que o resultado termina como Trueno final.

Você pode obter a semântica que deseja, declarando sua função de redução como tendo associatividade de encadeamento:

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
fonte