Perl 6 ลดฟังก์ชั่นและ metaoperator ลดให้ผลลัพธ์ที่แตกต่าง


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

คำถามของฉันคือสองเท่า: ประการแรกทำไม metaoperator ลดประมวลผล<ผู้ประกอบการแตกต่างกันอย่างไร ดูเหมือนว่า metaop ที่ลดลงนั้นประมาณว่าใช้ตัวแปรซึ่งในการเปลี่ยนแปลงครั้งแรกของจริงเป็นเท็จจะคงไว้ซึ่งการเปลี่ยนแปลงนั้นเพราะ:

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

ประการที่สองฉันต้องการใช้สิ่งนี้ภายในฟังก์ชั่นการลดเช่นแนะนำรหัสบางอย่างภายในวงเล็บปีกกาของฟังก์ชั่นการลดขนาดเพื่อให้ผลลัพธ์เช่นเดียวกับตัวดำเนินการลดเมตาดาต้า ฉันจะทำมันได้อย่างไร ขอบคุณ.

คำตอบ:


17

ทั้งเมตาดาต้าโอเปอเรเตอร์และreduceคำนึงถึงความสัมพันธ์ของโอเปอเรเตอร์ที่ส่งให้ ในกรณีของ<ผู้ประกอบการที่ถูกผูกมัด

เมื่อผ่านบล็อกที่กำหนดเองreduceจะไม่สามารถมองเห็นด้านในของบล็อกได้ดังนั้นจึงกลับไปสู่ค่าเริ่มต้นของการเชื่อมโยงด้านซ้าย จากนั้นจะเปรียบเทียบค่าในภายหลังกับบูลีนที่ส่งคืนจากตัวลดซึ่งทำให้เป็นตัวเลข0หรือ1ซึ่งเป็นเหตุให้ผลลัพธ์สิ้นสุดลงTrueในที่สุด

คุณสามารถรับความหมายที่คุณต้องการโดยประกาศฟังก์ชั่นการลดของคุณว่ามีความสัมพันธ์ที่ผูกมัด:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.