Perl 6 giảm chức năng và metaoperator giảm cho kết quả khác nhau


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

Câu hỏi của tôi là hai lần: Thứ nhất, tại sao meta metaoper xử lý <toán tử khác nhau? Có vẻ như metaop giảm được ước tính bằng cách sử dụng một biến, ở lần thay đổi đầu tiên là true thành false, vẫn giữ nguyên sự thay đổi đó bởi vì:

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

Thứ hai, tôi cũng muốn sử dụng hàm này bên trong hàm giảm, tức là giới thiệu một số mã bên trong dấu ngoặc nhọn của hàm giảm để nó mang lại kết quả tương tự như toán tử meta. Tôi làm nó như thế nào? Cảm ơn bạn.

Câu trả lời:


17

Cả toán tử meta và reducetính đến tính kết hợp của toán tử được truyền cho chúng; trong trường hợp <, toán tử đang xích.

Khi vượt qua một khối tùy chỉnh, reducekhông thể nhìn thấy bên trong khối đó và do đó, nó rơi trở lại mặc định của liên kết trái; sau đó so sánh các giá trị sau này với giá trị boolean được trả về từ bộ giảm tốc, số hóa thành 0hoặc 1, đó là lý do tại sao kết quả kết thúc như Truecuối cùng.

Bạn có thể có được ngữ nghĩa mà bạn mong muốn bằng cách khai báo hàm giảm của bạn là có tính kết hợp chuỗi:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.