3

我是Clojure /函數式編程方法的忠實粉絲,擁有不可變的值。應該將延遲視爲不可變的值嗎?

但是我不確定如果delay應被視爲一個不變的值(假設你延遲一個純函數)。我特別感興趣的是在更大的不可變數據結構中存在一個或多個延遲的情況。

例如含有延遲的向量:

[1 2 (delay (reduce + (range 1000)))] 

至於我可以看到這個行爲就好像它是在這個意義上的不可變的值,你看不到延遲的結果,直到你強迫它的評價 - 再結果被緩存,並且在此之後該值永遠不會改變。

以這種方式將延遲視爲不可變的值是否存在問題?

回答

3

延遲模型通常稱爲thunk,對尚未評估的表達式的引用,該表達式一旦被強制替換爲其結果,並且此後不可變。 Haskell使用這種內部可變的thunk來建模非嚴格的評估。表達式[1, 2, foldl1 (+) [0..1000]]與其嚴格評估的語言中明顯延遲的等價物名義上相同。

提供過程中的延遲對象使用的函數是純的,存在將它視爲不可變沒有壞處。您可以通過以下幾種方式來思考:

  • 根據定義,純函數可以用其結果替換。

  • 局部突變(在這種情況下,延遲的對象)不會使一個功能不純。

當然,Clojure的不純淨和不純的功能區分,所以它是由你作爲一個開發人員要勤快了。

1

delay是「價值生產者」同一個函數值製片人,剛纔那個delay使得「價值生產者代碼」懶洋洋地即執行時,它被要求的值,而不變性的屬性正在生成的值,因此可以認爲生成的值與函數調用時不變的值相同。這是關於產生的價值,但如果你的功能是副作用,那麼你可以有其他問題,但產生的價值仍然是不變的