我发现Haskell和Perl6最有趣的特性之一是能够将计算值推迟到实际需要的时候。
另一方面,Perl5喜欢立即完成所有事情,但据我所知,它包含了用于惰性评估的所有必要的原语。这些措施是:
@_
的引用创建一个数组引用,该数组引用被别名为其参数列表中的标识符,即使其中一些标识符尚未包含值。\@_
的子程序返回重载/绑定对象,然后在需要时取消引用。(还有各种不同的CPAN模块,它们抽象出了绑定/重载细节)我一直在用Perl进行各种懒散编程技术的实验(我在工作中有一个模块,它在Perl5中实现了相当一部分Haskell (比如协同递归:定义斐波纳契序列的$_ = list 0, 1, zipWith {&sum} $_, tail $_ for my $fibs;
已经在工作))。但是我有一种感觉,在代码中隐藏了一些微妙的But,当函数被使用在更大的表达式/程序中时,这些But可能会显现出来。
因此,我想知道是否有人知道有什么好的例子(CPAN /blog/book)雇用Haskell/ Perl5 6,比如Perl5中的懒惰?特别是,我想读一遍任何使用这种懒惰的大代码。
我还想知道,在Perl 5中,是否有人遇到过与延迟计算的实现有关的问题或棘手的问题。
发布于 2010-12-07 22:57:48
高级Perl (可免费获得的在线)有一章叫做“无限流”。也许这是个很好的起点。
发布于 2010-12-07 23:44:50
好吧,驼鹿用延迟加载属性做这个
默认和构建器方法 属性可以有默认值,而Moose提供了两种方法来指定默认值。 “默认”和“建造者”选项描述..。 惰性 驼鹿可以通过使属性“懒惰”来延迟属性总数: 有'size‘=> ( is => 'ro',惰性=> 1,builder => '_build_size’); 当“懒惰”为真时,在调用读取器方法之前不会生成默认值,而不是在对象构造时。您可能选择这样做有几个原因。 首先,如果该属性的默认值依赖于其他属性,则该属性必须“懒惰”。在对象构造期间,不按可预测的顺序生成默认值,因此在生成默认值时不能指望填充其他属性。 第二,在需要违约之前,通常没有理由计算它。使属性“懒惰”使您可以将成本推迟到需要属性时再计算。如果不需要该属性,则可以节省一些CPU时间。 我们建议您使用构建器或非平凡的默认属性来创建任何属性,这是理所当然的。
发布于 2010-12-07 22:54:54
我认为最大的问题是“魔法冲突”。当您试图做一些您认为是不确定的事情,而其他模块的作者试图做一些他们认为是不确定的事情。谁的魔法赢了?
一个人总是可以窥视另一个变量的魔力,甚至在不经意间驱散它,魔法永远不会防弹。
如果您可以通过穷举的案例测试来实现100%的正交性,您可能可以休息easier...maybe。
https://stackoverflow.com/questions/4382337
复制相似问题