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.

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.