2 回答

TA貢獻1783條經(jīng)驗 獲得超4個贊
這就是函數(shù)編程的思想。一切都是不可變的,不允許任何函數(shù)調(diào)用產(chǎn)生副作用。像您的示例一樣,突變復(fù)雜對象的唯一方法是重新創(chuàng)建父對象。
現(xiàn)在的問題是如何更改程序狀態(tài)。因此,我們首先考慮堆棧。它包含所有局部變量的值以及被調(diào)用函數(shù)的所有參數(shù)的值。我們可以通過調(diào)用新函數(shù)來創(chuàng)建新值。我們可以通過從函數(shù)返回來丟棄值。因此,我們可以通過調(diào)用函數(shù)來改變程序狀態(tài)。但是,并非總是可以從函數(shù)中返回以丟棄其局部變量,因為我們可能只希望丟棄某些局部變量,而需要保留其他局部變量的值以進行進一步的操作。在這種情況下,我們根本無法返回,但是我們需要調(diào)用另一個函數(shù)并將僅一些局部變量傳遞給該函數(shù)?,F(xiàn)在,為了防止堆棧溢出,功能語言具有稱為“尾部調(diào)用優(yōu)化”的功能,能夠從調(diào)用堆棧中刪除不必要的條目。如果關(guān)聯(lián)函數(shù)唯一要做的就是返回自身調(diào)用的函數(shù)的值,則不需要調(diào)用堆棧。在這種情況下,沒有必要保留調(diào)用堆棧條目。通過刪除不必要的調(diào)用堆棧條目,將丟棄原本未使用的局部變量的值。您可能想了解一下在這里。另外,尾遞歸與此有關(guān)。
同樣,這是純函數(shù)式編程語言(如Haskell)的想法。一切都是不可變的,這真是太好了,但是這些語言只有它們自己的問題,并且有自己的處理方式。例如,Monad(以及更高種類的類型)可以在這些語言中使用,但是在命令式/面向?qū)ο蟮木幊陶Z言中很少見。
我喜歡在程序存儲器的葉子處具有不變的值。但是,構(gòu)成這些不可變值的代碼實際上構(gòu)成了應(yīng)用程序邏輯,但確實包含可變狀態(tài)。對我來說,這結(jié)合了兩個世界的優(yōu)勢。但是,這似乎是一個優(yōu)先事項。
添加回答
舉報