Rom*_*rio 12 reduction perl6 raku
my @s=<1 2 3 2 3 4>;
say reduce {$^a < $^b}, @s;
say [<] @s;
# --------
# True
# False
我的问题有两个方面:首先,为什么归约元<运算符对运算符的处理方式不同?似乎归约元操作估计使用了一个变量,在从true到false的第一个更改中,保留了该更改,原因是:
say [\<] @s;
# ----------
# (True True True False False False)
其次,我也想在reduce函数中使用它,即,在reduce函数的花括号内引入一些代码,以使其产生与reduce元运算符相同的结果。我该怎么做?谢谢。
Jon*_*ton 17
元操作符和reduce传递给它们的操作符的关联性都考虑在内;对于<,操作员正在链接。
传递自定义块时,reduce看不到它的内部,因此它回退到左关联的默认值;然后,它将后面的值与reducer返回的布尔值进行比较,布尔值将量化为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