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 返回的布尔值进行比较,后者将数值化为 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
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 返回的布尔值进行比较,后者将数值化为 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