gpt4 book ai didi

lazy-evaluation - Perl 6 中的有限列表可以是惰性的吗?

转载 作者:行者123 更新时间:2023-12-03 22:45:20 26 4
gpt4 key购买 nike

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

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;

不过,这并不懒惰。

最佳答案

在我看来,“is-lazy”方法确实是用词不当。正如 cuonglm 指出的那样,它唯一说的就是传递底层迭代器声称是懒惰的。但这仍然没有任何意义,真的。迭代器在技术上可以按需产生值,但仍然声称它不是懒惰的。反之亦然。

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

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

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

关于lazy-evaluation - Perl 6 中的有限列表可以是惰性的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43386971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com