Perl 6 mengurangi fungsi dan reduksi metaoperator memberikan hasil yang berbeda

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

Pertanyaan saya ada dua: Pertama, mengapa metaoperator reduksi memproses <operator secara berbeda? Sepertinya reduksi metaop diperkirakan menggunakan variabel yang, pada perubahan pertama dari true ke false, mempertahankan perubahan itu karena:

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

Kedua, saya ingin menggunakan ini di dalam fungsi pengurangan juga, yaitu memperkenalkan beberapa kode di dalam kurung kurawal fungsi pengurangan sehingga memberikan hasil yang sama dengan operator meta pengurangan. Bagaimana saya bisa melakukannya? Terima kasih.

Romario
sumber

Jawaban:

17

Baik meta-operator dan reducememperhitungkan asosiasi operator yang diberikan kepada mereka; dalam hal ini <, operator chaining.

Ketika melewati blok khusus, reducetidak dapat melihat di dalamnya, dan karena itu jatuh kembali ke default asosiatif kiri; kemudian membandingkan nilai-nilai selanjutnya dengan boolean yang dikembalikan dari reducer, yang dinotasikan ke 0atau 1, itulah sebabnya hasilnya berakhir seperti Truepada akhirnya.

Anda bisa mendapatkan semantik yang Anda inginkan dengan mendeklarasikan fungsi reduksi sebagai memiliki asosiatif rantai:

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
sumber