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到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