簡體   English   中英

Perl 5中的惰性評估技術示例?

[英]Examples of lazy evaluation techniques in Perl 5?

我發現Haskell和Perl6的最有趣的功能之一就是能夠將計算值推遲到實際需要時才進行。

另一方面,Perl5喜歡立即執行所有操作,但是據我所知,它包含所有用於惰性求值的必要原語。 那些是:

  • 在子例程中對@_進行引用會創建一個數組引用,該數組引用將作為其參數列表中的標識符的別名,即使其中一些標識符尚不包含值。
  • 從內部保存\\@_此類子例程返回重載/綁定對象,然后在需要時取消引用。 (並且有各種CPAN模塊可以抽象出平局/過載細節)

我已經在Perl中嘗試了各種惰性編程技術(我的作品中有一個模塊可以在Perl5中實現相當一部分的Haskell Prelude(類似共遞: $_ = list 0, 1, zipWith {&sum} $_, tail $_ for my $fibs;定義斐波那契數列已在起作用))。 但是我有種感覺,當在較大的表達式/程序中使用函數時,代碼中會隱藏一些細微的錯誤。

因此,我想知道是否有任何人知道使用Haskell / Perl6的好例子(CPAN /博客/書籍),例如Perl5中的懶惰? 特別是,我想通讀使用這種惰性的任何規模很大的代碼。

我也想知道是否有人在Perl 5中實施延遲評估時遇到任何麻煩或棘手的問題。

高階Perl(可在線免費獲得)有一章稱為“無限流”。 也許這是一個很好的起點。

好吧, Moose通過延遲加載屬性來做到這一點:

默認和生成器方法
屬性可以具有默認值,Moose提供了兩種方法來指定該默認值。
[描述了“默認”和“構建器”選項...]

懶惰
Moose使您可以通過使屬性“惰性”來延遲屬性填充:

 has 'size' => ( is => 'ro', lazy => 1, builder => '_build_size', ); 

當“ lazy”為true時,默認值是在調用reader方法之前生成的,而不是在對象構造時生成的。 您可能有幾個選擇這樣做的原因。

首先,如果此屬性的默認值取決於其他一些屬性,則該屬性必須為“惰性”。 在對象構造期間,不會以可預測的順序生成默認值,因此在生成默認值時,您不能指望正在填充的某些其他屬性。

其次,通常沒有理由在需要默認值之前計算它。 將屬性設置為“惰性”可讓您將成本推遲到需要該屬性之前。 如果不需要該屬性,則可以節省一些CPU時間。

我們建議您理所當然地使用構建器或非平凡的默認“惰性”來設置任何屬性。

我認為最大的問題是“魔術沖突”。 當您嘗試做某事時,您認為是虛假的,而其他模塊作者正在嘗試做某事,而他們認為這是虛假的,結果是不確定性。 誰的魔力贏了?

正如人們總是可以窺視另一個變量的魔力,甚至不經意地將其分解一樣,魔力從來都不是防彈的。

如果您可以通過詳盡的案例測試獲得100%的正交性,則也許可以更輕松地休息……也許。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM