Perl6 hyper » 运算符不像地图那样工作

Perl6 hyper » operator doesn't work like map

据我所知,超级运算符 »map() 的快捷方式。为什么下面的 return 有两个不同的结果,而在第二个例子中 .sum 似乎没有被应用?

say ([1,2], [2, 2], [3, 3]).map({.sum});
# (3 4 6)
say ([1,2], [2, 2], [3, 3])».sum;
# ([1 2] [2 2] [3 3])

Hyperops 递归地下降到子列表中。他们也是自动线程 (NYI) 的候选者,这意味着他们的操作是乱序的。

还有一个错误已通过 https://github.com/rakudo/rakudo/commit/c8c27e93d618bdea7de3784575d867d9e7a2f6cb 更正。

say ([1,2], [2, 2], [3, 3])».sum;
# (3 4 6)

TL;DR 您几乎肯定遇到了错误。也就是说,map» hyperop 有很大的不同。

mapreturns一个Seq。这 Seq 产生将用户提供的代码应用于用户提供的数据结构的每个元素的结果:

  • 一层深(数据结构的遍历很浅——map不会递归地下降到数据结构顶层的子结构)
  • 一次一个(所有事情都是按顺序完成的,没有并行的)
  • 延迟(map returns 立即;用户提供的代码应用于用户提供的数据结构,以便稍后根据需要从 Seq 中提取值来生成结果)

» hyperop returns 首次将其右侧的一元运算应用于该数据结构的元素后,其左侧的数据结构操作数:

  • 只有一层深度 下降到 leaves 由一元运算决定
  • 在并行批处理中,至少在语义上(程序员有责任选择一元操作,当以任意顺序并行应用于多个元素时,该操作将产生正确的结果)
  • 急切地(与 map 调用不同,当一元运算符应用于整个数据结构时,只有 returns 超操作)

如果你应用的一元运算符是"nodal"(所以超运算将选择不下降)被操作的数据结构只有一层深(因此超操作没有较低级别的叶子可以下降到)那么超操作和使用一元运算符的 map 之间的区别只是 sequential/parallel 和 lazy/eager 方面。

我很清楚 sum 应该是一个节点运算符,否则它会下降到子结构,直到它到达单个叶子并因此最终被应用于一堆单一值这是毫无意义的。 预计到达时间: 看来现在已经修复了。