据我所知,超运算符»
是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])
据我所知,超运算符»
是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])
Hyperops递归地下降到子列表中。他们也是自动阅读的候选人(NYI),意味着他们的操作失灵。
此外还有一个错误,用https://github.com/rakudo/rakudo/commit/c8c27e93d618bdea7de3784575d867d9e7a2f6cb纠正。
say ([1,2], [2, 2], [3, 3])».sum;
# (3 4 6)
TL; DR你几乎可以肯定是遇到了一个错误。也就是说,map
和»
Hyperop有很大的不同。
map
返回Seq。此Seq
产生施加用户提供的代码给每个用户的元件的提供的数据结构的结果:
map
不递归下降到子的数据结构的顶层)map
返回;用户提供的代码被施加到用户提供的数据结构后,以生成结果根据需要从Seq
提取数值)的»
hyperop返回上的数据结构的操作数其左侧后首先将其右边的一元操作该数据结构的元素:
map
呼叫,超运算只有当一元运算符已经被应用到整个数据结构)如果你申请一个一元运算符是"nodal"(返回所以超运算会选择不下降)或上正在操作的数据结构仅是一个层次深度(因此没有较低的水平叶为超运算下降到),然后用一元运算符超运算和map
之间的差异仅仅是顺序/平行和懒惰/渴望方面。
我似乎很清楚sum
应该是一个节点操作符,否则它会下降到子结构,直到它到达单个叶子并因此最终应用于一堆无意义的单值。 ETA:看起来它现在已经修复。
所有这一切都是真实的,但请注意,hyperoperators不一定会下降到子结构(参见'say([1,2],[2,2],[3,3])»。elems');可以说,'List.sum'只是缺少一个'nodal'注释...... – Christoph