Perl 6的reduce函数和reduce metaoperator给出不同的结果


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

我的问题有两个方面:首先,为什么归约元<运算符对运算符的处理方式不同?似乎归约metaop估计使用了一个变量,在从true到false的第一次更改中,保留了该更改,原因是:

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

其次,我也想在reduce函数中使用它,即在reduce函数的花括号内引入一些代码,以便它提供与reduce meta运算符相同的结果。我该怎么做?谢谢。

Answers:


17

元操作符和reduce传递给它们的操作符的关联性都考虑在内;对于<,操作员正在链接。

传递自定义块时,reduce看不到它的内部,因此它退回到默认的左关联;然后,将后面的值与reducer返回的布尔值进行比较,布尔值将量化为01,这就是为什么最终结果如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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.