【发布时间】:2017-01-17 11:59:48
【问题描述】:
我有这段代码。第一个,非嵌套的 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:
这与问题How can I use "map" inside a "for" loop in Perl 6?有关。那个说要做什么,但我问的更多的是一个为什么的问题。
解决方案是在内部添加eager、sink 或赋值map:
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 $_;
}
};
【问题讨论】:
-
不知何故,我认为 Perl 6 应该能够为我解决这个问题。 返回
Seq是一个有效的用例。由于编译器无法读心,您更喜欢哪种常规语义?使接收器上下文递归,在接收器上下文中迭代序列的所有子序列?对我来说,这看起来像是一罐可能应该保持关闭的蠕虫 -
我更希望有一个类似地图的东西,它会返回一个列表。它是一个序列而不是有序列表的想法对我来说似乎很奇怪。
-
回想起来,我也花了一段时间才适应了序列:理论上,它们是更好的原语(例如,您可以轻松地将序列制作成列表,但反过来不行),但是在实践中存在一些摩擦。不过,这个特殊问题不是关于序列与列表,而是懒惰......
-
所以您希望
map { $_+1 }, 1..*或[\+] 1..*返回一个列表?如果你只需要 Seq 的前几个元素,它只会产生前几个,而不是浪费一堆时间。say [\+](1,3...*)[^20]Seqs 也可以在迭代中使用它们后丢弃这些值(如果你不做任何事情来缓存它们)。曾经有一段时间,List 会同时完成这两项工作,即使对于实施者来说,也更难推理。 -
我真的什么都不想要。初学者在使用某些东西之前必须知道多少。在这里他们必须明白一点,所以他们会犯这种错误。
标签: lazy-evaluation raku