2016-08-03 53 views
6

据我所知,超运算符»map()的快捷方式。为什么以下返回两个不同的结果,并在第二个示例.sum似乎不适用?Perl6 hyper»运算符不起作用,如地图

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]) 

回答

6

Hyperops递归地下降到子列表中。他们也是自动阅读的候选人(NYI),意味着他们的操作失灵。

此外还有一个错误,用https://github.com/rakudo/rakudo/commit/c8c27e93d618bdea7de3784575d867d9e7a2f6cb纠正。

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

所有这一切都是真实的,但请注意,hyperoperators不一定会下降到子结构(参见'say([1,2],[2,2],[3,3])»。elems');可以说,'List.sum'只是缺少一个'nodal'注释...... – Christoph

5

TL; DR你几乎可以肯定是遇到了一个错误。也就是说,map» Hyperop有很大的不同。

map返回Seq。此Seq产生施加用户提供的代码给每个用户的元件的提供的数据结构的结果:

  • 一层深(该数据结构的遍历是浅 - map不递归下降到子的数据结构的顶层)
  • 一项的结构在一个时间(一切被顺序地完成,在并行无)
  • 懒惰地(立即map返回;用户提供的代码被施加到用户提供的数据结构后,以生成结果根据需要从Seq提取数值)

» hyperop返回上的数据结构的操作数其左侧后首先将其右边的一元操作该数据结构的元素:

  • 仅深下降到leaves一个水平由一元运算
  • 并联批次,至少语义所指示当应用到在对多个元件(它是程序员的责任挑一元运算,将产生正确的结果以任意顺序llel)
  • 热切(不像map呼叫,超运算只有当一元运算符已经被应用到整个数据结构)

如果你申请一个一元运算符是"nodal"(返回所以超运算会选择不下降)上正在操作的数据结构仅是一个层次深度(因此没有较低的水平叶为超运算下降到),然后用一元运算符超运算和map之间的差异仅仅是顺序/平行和懒惰/渴望方面。

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