我正在學習函數式編程,我可以理解爲什麼不變性比可變對象更受歡迎。爲什麼變量賦值不應該用在函數式編程中
This文章也解釋得很好。
但我無法理解爲什麼賦值應該在純函數內執行。
我可以理解的一個原因是變量可變性導致鎖定,因爲在scala中的純函數中,我們主要是遞歸遞歸,並且這會在調用堆棧而不是堆上創建變量/對象。
是否有任何其他原因爲什麼應避免函數式編程中的變量賦值?
我正在學習函數式編程,我可以理解爲什麼不變性比可變對象更受歡迎。爲什麼變量賦值不應該用在函數式編程中
This文章也解釋得很好。
但我無法理解爲什麼賦值應該在純函數內執行。
我可以理解的一個原因是變量可變性導致鎖定,因爲在scala中的純函數中,我們主要是遞歸遞歸,並且這會在調用堆棧而不是堆上創建變量/對象。
是否有任何其他原因爲什麼應避免函數式編程中的變量賦值?
分配和重新分配之間有區別。函數式編程中不允許重新賦值,因爲它的可變性在純函數中是不允許的。允許變量賦值。
val a = 1 //assignment allowed
val a = 2 //re-assignment not allowed
從外部世界讀取不純的時尚(改變狀態)是函數式編程的一個副作用。
因此,訪問一個可能被突變的全局變量的函數並不是純粹的。
一般
當您紀律的生活是那麼混亂。這正是功能編程所提倡的。當生活不那麼混亂時,你可以專注於生活中更美好的事物。
所以,對於不可改變的主要原因
它變得難以推理與突變的程序的正確性。在併發程序的情況下,這是非常痛苦的調試。
這意味着變得難以跟蹤變量經歷的變化以理解代碼/程序或調試程序。
突變是使程序難以理解和推理的副作用之一。功能編程強化了這個規範(使用不變性),以便代碼可維護,表達和可理解。
純函數是在一個不具有副作用。
副作用:
避免上述副作用使函數僅依賴於函數的參數n而不是任何外部價值或狀態。
純功能是最獨立的功能,它既不從世界讀取也不寫入世界。它不會暫停或中斷程序控制流程。
上述屬性使純函數易於理解和推理。
其從共域範圍,其中在共域中的每個值映射到在範圍一個值的映射。
這意味着如果f(2)等於4那麼f(2)是4,而不管世界的狀態如何。
純函數是一組輸入和一組允許輸出之間的關係,其中每個輸入只與一個輸出有關。
一個純粹的函數只取決於給它的參數。這意味着每次使用相同的參數調用函數時,函數都會返回相同的結果。如果函數使用在函數外定義的變量,那麼它每次都不會返回相同的結果。這取決於變量! – marstran
看看http://stackoverflow.com/questions/1791408/what-is-the-difference-between-a-var-and-val-definition-in-scala – nmat
如果變量是本地的功能並沒有在其他地方使用? –