Raku (née Perl 6) 归约函数和归约元运算符给出不同的结果


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元运算符相同的结果。我该怎么做?谢谢。

元运算符和reduce都考虑传递给它们的运算符的关联性;在<的情况下,运算符是链接的。

当传递一个自定义块时,reduce看不到它的内部,所以它回退到左关联的默认;然后它将后面的值与从化简器返回的布尔值进行比较,后者被num到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

最新更新