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

时间:2016-08-03 10:55:57

标签: perl6

据我所知,超级运营商»map()的捷径。为什么以下返回两个不同的结果,而在第二个示例.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])

2 个答案:

答案 0 :(得分:7)

Hyperops以递归方式下降到子列表中。他们也是自动阅读(NYI)的候选人,这意味着他们的操作无序。

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

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

答案 1 :(得分:6)

TL; DR 您几乎肯定遇到过错误。也就是说,map» hyperop有很大差异。

map会返回Seq。这个Seq产生了将用户提供的代码应用于用户提供的数据结构的每个元素的结果:

  • 一层深(数据结构的遍历很浅 - map没有递归地下降到数据结构的顶级子结构中)
  • 一次一个(一切顺序完成,没有任何并行)
  • 懒惰(map立即返回;用户提供的代码将应用于用户提供的数据结构,以便稍后根据需要生成结果以从Seq中提取值)

» hyperop在首先将右侧的一元操作应用于该数据结构的元素后,返回其左侧的数据结构操作数:

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

如果您正在应用"nodal"的一元运算符(因此超级运算将选择不下降)正在运行的数据结构只有一层深(所以没有低级别的叶子让超级运动下降到)然后,超级运算和map与一元运算符之间的差异只是顺序/并行和懒惰/急切方面。

我似乎很清楚,sum应该是一个节点运算符,否则它将下降到子结构,直到它到达单个叶子并因此最终被应用于一堆单个值,这是无意义。 ETA:现在看起来已经修好了。