【问题标题】:Can a finite list be lazy in Perl 6?Perl 6 中的有限列表可以是惰性的吗?
【发布时间】:2017-04-13 08:18:16
【问题描述】:

假设我有一个序列,其中我知道起点和终点,并且生成器很简单。我可以让它变得懒惰吗?

my @b = 0 ... 3;
say 'Is @b lazy? ' ~ @b.is-lazy; # Not lazy

我想将该已知列表与其自身组合未知次数,但不会立即生成整个列表。我想让@cross 偷懒:

my @cross = [X] @b xx $n;

我知道我可以通过其他简单的事情或编程来做到这一点(我的 Perl 5 Set::CrossProduct 就是这样做的),但我很好奇是否有一些我想念的简单和预期的方式。一些不涉及我自己的方式。

作为一个附带问题,序列的什么特性使它变得懒惰?它只是端点吗?如果生成器可以在它们之间产生无限值,是否存在具有已知端点的序列仍然可以是惰性的?我想知道我必须删除多少信息并尝试了这样的方法:

my $m = @*ARGS[0];
my @b = 0, * + $m ... ^ * > 3;
say 'Is @b lazy? ' ~ @b.is-lazy;
say '@b: ' ~ @b;

不过,这并不懒惰。

【问题讨论】:

    标签: lazy-evaluation raku


    【解决方案1】:

    在我看来,“is-lazy”方法确实是用词不当。正如 cuonglm 所指出的,它唯一说的就是传递底层迭代器声称是惰性的。但那仍然并不意味着什么,真的。迭代器在技术上可以按需生成值,但仍然声称它并不懒惰。反之亦然。

    “is-lazy”检查在内部使用以防止需要提前知道元素数量的情况(如 .roll 或 .pick):如果 Seq / iterator 声称是惰性的,它不会实际尝试,但失败或抛出。

    .lazy 唯一要做的就是将 Seq 的迭代器包装到另一个 确实 声称是惰性的迭代器中(当然,如果给定的迭代器声称它不是惰性的)。并确保它不会提取任何值,除非真的需要。因此,添加 .lazy 并不能说明何时会产生值,而只会说明何时会交付它们。它有助于测试基于迭代器的逻辑,以了解它们如何与声称是惰性的迭代器一起工作。

    所以,回到这个问题:如果你想确定某些东西是惰性的,你将不得不自己编写迭代器。话虽如此,在过去的几个月里,我花了很多精力在核心中让事情变得尽可能懒惰。值得注意的是 xx N 仍然不是懒惰的,尽管它现在确实产生了 Seq。让它变得懒惰在某些深层次上破坏了一些我还无法弄清楚的spectests。展望未来,我认为您可以确定事情会像一般意义上的那样懒惰,也许有可能表明优先使用内存而不是 CPU。但是你永远无法完全控制内置函数:如果你想要完全控制,你必须自己编写。

    【讨论】:

      【解决方案2】:

      是的,你可以,使用lazy method

      > my @b = (0 ... 3).lazy;
      [...]
      > say 'Is @b lazy? ' ~ @b.is-lazy;
      Is @b lazy? True
      

      没有什么特别的 Seq 让它变得懒惰,只是它的底层 Iterator 会。

      【讨论】:

        【解决方案3】:

        正如已经指出的那样,is-lazy 并没有真正的意义。

        但我只想提一下,page on rakudo wiki 提供了一些线索,说明您可以从 is-lazy 获得什么。

        【讨论】:

          【解决方案4】:

          你可以:

          my @b = 0 ... 3;
          

          懒惰只需在正确的位置添加 lazy 关键字,如下所示:

          my @b = lazy 0 ... 3;
          

          或者,正如 cuonglm 指出的那样,您可以调用范围的方法,如下所示:

          my @b = (0 ... 3).lazy;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-20
            • 1970-01-01
            相关资源
            最近更新 更多