Raku(née Perl 6)reduce 函数和 reduction metaoperator 给出不同的结果

Raku (née Perl 6) reduce function and reduction metaoperator give different results

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

我的问题有两个: 首先,为什么归约元运算符以不同方式处理 < 运算符?看起来 reduction metaop 估计使用了一个变量,该变量在第一次将 true 更改为 false 时保留了该更改,因为:

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

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

元运算符和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