Perl 6 有 lazy lists ,但它也有无界Range对象。你应该选择哪一个来计算整数?
还有无限Range有两个点:
0 .. *
这是Seq (sequence)三个点:
0 ... *
一个
Range
使用它们的自然顺序生成连续的事物列表。它继承自 Iterable ,还有Positional所以你可以索引一个范围。您可以检查是否有内容在 Range
内,但这不是任务的一部分。一个
Seq
只要知道如何到达下一个元素,它就可以生成您喜欢的任何内容。它继承自 Iterable ,还有PositionalBindFailover哪个是假的 Positional
通过缓存和列表转换的东西。如果你只是从一个元素移动到下一个元素,我认为这没什么大不了的。我要来回讨论这个。目前我在想它是 Range .
最佳答案
两者 0 .. *
和 0 ... *
没事。
for
循环,在这两种情况下具有完全相同的效果。 (保留已经迭代的元素都不会泄漏内存。)@
变量产生相同的惰性数组。 因此,只要您只想以 1 为步长将数字加到无穷大,我认为这两者都没有缺点。
...
序列构造运算符更通用,因为它也可以用于1, 3 ... *
) 10 ... -Inf
) 2, 4, 8 ... *
) 1, 1, *+* ... *
) 所以当我需要做类似的事情时,我会考虑使用
...
对于任何附近和相关的“加一”,为了一致性。另一方面:
Range
可以有效地索引,而不必生成和缓存所有前面的元素,所以如果除了迭代它之外还想索引计数器,最好。处理元素位置的其他列表操作也是如此,例如 reverse
:Range
对它们有有效的重载,而在 Seq
上使用它们必须首先迭代和缓存它的元素。 1 .. $n
),使用 Range
更安全。因为你可以确定它永远不会倒数,无论如何$n
是。 (如果端点小于起点,如在 1 .. 0
中,它将在迭代时表现为一个空序列,这在实践中往往会得到正确的边缘情况。)相反,如果您想安全地向下计数以确保它永远不会意外向上计数,您可以使用
reverse 1 .. $n
. Range
是“从 x 到 y 的数字”概念的更具体/高级表示,而 Seq
代表“一系列值”的更通用的概念。一个 Seq
通常,由任意生成器代码驱动(参见 gather
/ take
) - ...
运算符只是用于创建一些常见类型序列的语义糖。因此,当“从 x 到 y 的数字”是您想要表达的概念时,使用 Range 可能会感觉更具声明性。但我想这纯粹是心理问题... :P 关于range - 我应该在 Perl 6 中用序列还是范围来计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40008122/