我有这段代码。第一个非嵌套的
这里是输出结果:
这与问题“如何在Perl 6的for循环中使用map?”有关。那个答案告诉我们该怎么做,但我想问一个更深层次的问题——为什么要这样做。
map
输出了一些内容,而嵌套的则没有。我认为我知道第二个为什么不工作了。它是一个惰性序列,Perl 6 正在收集结果。这很好。但是第一个(非嵌套)map
是否以相同的方式惰性呢?如果我不做任何处理,则它如何输出任何内容?也就是说,第一个是否惰性?它是否自动获得下沉上下文,我必须明确提供 sink
(或其他内容)给嵌套的那一个?不知怎么回事,我觉得 Perl 6 应该能够为我解决这个问题。my @array = (1, 2), (3, 4), ('a', 'b');
say "---On its own:";
my @item = 1, 2, 3;
@item.map: {
say $_;
};
say "---Inside another map:";
@array.map: {
my @item = 1, 2, 3;
@item.map: {
say $_;
}
};
这里是输出结果:
---On its own:
1
2
3
---Inside another map:
这与问题“如何在Perl 6的for循环中使用map?”有关。那个答案告诉我们该怎么做,但我想问一个更深层次的问题——为什么要这样做。
在那个问题的解决方案中,需要在map
内部添加eager
、sink
或赋值操作:
say "---eager:";
@array.map: {
my @item = 1, 2, 3;
eager @item.map: {
say $_;
}
};
say "---sink:";
@array.map: {
my @item = 1, 2, 3;
sink @item.map: {
say $_;
}
};
say "---assignment:";
@array.map: {
my @item = 1, 2, 3;
@ = @item.map: {
say $_;
}
};
Seq
是一个有效的用例。由于编译器无法读取思想,您希望使用什么样的常规语义?将sink上下文递归地迭代序列的所有子序列作为sink上下文?对我来说,那看起来像是一罐蠕虫,可能应该保持关闭状态。 - Christophmap { $_+1 }, 1..*
或者[\+] 1..*
返回一个列表?如果你只需要 Seq 的前几个元素,它只会产生前几个元素而不会浪费大量时间。say [\+](1,3...*)[^20]
Seqs 在迭代使用后也可以丢弃值(如果你没有对它们进行缓存)。曾经有一段时间 List 承担了这两个任务,即使对于实现者来说,这也是非常难以理解的。 - Brad Gilbert