【问题标题】:Raku (née Perl 6) reduce function and reduction metaoperator give different resultsRaku (née Perl 6) reduce function 和 reduction metaoperator 给出不同的结果
【发布时间】:2020-02-06 15:44:03
【问题描述】:
my @s=<1 2 3 2 3 4>;
say reduce {$^a < $^b}, @s;
say [<] @s;
# --------
# True
# False

我的问题有两个: 首先,为什么归约元运算符对&lt; 运算符的处理方式不同?看起来减少元操作估计使用了一个变量,该变量在第一次将 true 更改为 false 时会保留该更改,因为:

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

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

【问题讨论】:

    标签: raku reduction


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2021-09-25
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多