range - 我应该在 Perl 6 中用序列还是范围来计数?

标签 range raku seq

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/

    相关文章:

    javascript - 使用包含当前值的 float DIV 自定义 HTML 范围输入

    尝试使用 list.insert 时出现 Python 索引错误

    raku - 在 'raw' Positional 的类中从 AT-POS 方法(而不是代理实例)返回 'does' 标量容器?

    raku - Perl 6 : Backslashes in transliteration (tr///)

    scala - 如何高效/优雅地提取连续整数的范围?

    tcp - TCP序列号是如何存储的?

    variables - 将变量传递给xquery xpath属性查询

    python - 如何编写一个范围,以便其中一个值对用户输入开放

    raku - :D and :D:?有什么区别

    r - 从整数向量构建一个更长的向量,包括与原始整数的距离最多为 10 的所有整数