据我所知,超级运营商»
是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])
答案 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在首先将右侧的一元操作应用于该数据结构的元素后,返回其左侧的数据结构操作数:
map
调用不同,只有当一元运算符应用于整个数据结构时才会返回超级运算)如果您正在应用"nodal"的一元运算符(因此超级运算将选择不下降)或正在运行的数据结构只有一层深(所以没有低级别的叶子让超级运动下降到)然后,超级运算和map
与一元运算符之间的差异只是顺序/并行和懒惰/急切方面。
我似乎很清楚,sum
应该是一个节点运算符,否则它将下降到子结构,直到它到达单个叶子并因此最终被应用于一堆单个值,这是无意义。 ETA:现在看起来已经修好了。