Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了懒惰评估 – Perl 6中的有限列表是否可以延迟?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个序列,我知道起点和终点,发电机很简单.我可以让它变懒吗? @H_791_2@my @b = 0 ... 3; say 'Is @b lazy? ' ~ @b.is-lazy; # Not lazy

我想将已知列表与其自身组合未知次数但不立即生成整个列表.我希望@cross懒惰:

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

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

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

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

不过,这并不是懒惰.

解决方法

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

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

.lazy唯一能做的就是将Seq的迭代器包装到另一个声称是懒惰的迭代器中(如果给定的迭代器声称它不是懒惰的话).除非确实需要,否则请确保它不会提取任何值.因此,添加.lazy并不会告诉我们什么时候会产生值,只有当它们被传递时.它有助于测试基于迭代器的逻辑,看看它们如何与声称是懒惰的迭代器一起工作.

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

大佬总结

以上是大佬教程为你收集整理的懒惰评估 – Perl 6中的有限列表是否可以延迟?全部内容,希望文章能够帮你解决懒惰评估 – Perl 6中的有限列表是否可以延迟?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。