2017-01-10 75 views

回答

1

在Scheme中,承諾只是一個具有未完成任務的值,如果您從不使用該值,則永遠不會計算該值。簡而言之,這是一種在其他渴望的計劃中進行懶惰評估的方法。一種典型的方法是在流而不是列表上進行計算。

通過列表,您可以使用更高階的函數,以便您可以列出一個列表,然後針對您感興趣的值對其進行過濾,然後轉換這些值,並且可能在某個時刻您有足夠的時間來生成所需的值。這是很好的,因爲你可以抽象每一步,這樣你就可以製作只執行一步的邏輯並組成步驟來製作整個程序,但在這種情況下,第一步需要全部完成才能在下一步處理結果第一個可能是,如果你正在搜索0到1000之間的第一個素數,並且在每一步中迭代了所有數字,那麼它可能不是那麼有效。這裏是流進來的地方。

流與代碼看起來相同,但中間結果是由需要。一個流是一對,其中的部分是承諾,以便代碼,否則會使一對延遲,直到使用的值。每一步都會爲下一步生成足夠的數據,因此應該足以讓第一步爲最後一步迭代20%的元素,以計算出最終結果,其中80%的休息永遠不會在任何步驟。對於這樣的結構,初始流也可以是無限的,如從0開始的所有數字增加1.

使用流涉及懲罰。想象一下,你可以制定一個算法來訪問所有的元素。然後,算法的流版本會比較慢,因爲創建的承諾和強制會導致程序開銷,而不是懶惰地進行計算。

您可能有興趣看到Hal Abelson explaining streams及其優缺點。

流還有其他替代方法可以進行懶惰評估。一個是generators。在這裏,您還可以製作組合程序,它需要一個生成器並生成一個生成器。迭代將需要像流一樣。

另一種選擇是transducers。這也是可組合的,並且像流和生成器一樣迭代,但與生成器不同,初始數據不能像流和生成器那樣是無限的序列,除非底層結構支持它。

在這個答案中使用承諾或任何其他技術的優點是不是方案特定的。它們適用於所有渴望的編程語言!

相關問題