2012-06-29 14 views
7

我目前正在努力掌握Erlang。這是我研究的第一個函數式編程語言,我注意到在Erlang中,你所做的每個任務都是一次賦值。顯然,不僅在Erlang中,而且在許多其他函數式編程語言中,分配都是通過單個賦值完成的。單一作業的目的

我真的很困惑他們爲什麼這樣做。單一任務的目的究竟是什麼?我們可以從中獲得什麼好處?

+0

我建議檢查[這個答案](http://stackoverflow.com/a/9764997/1229023)。簡而言之,它不是這樣的任務;這是一個名稱綁定過程。 – raina77ow

+0

可能更適合[programmers.se]。 – darvids0n

+0

[這個問題]的答案(http://stackoverflow.com/questions/9494601/why-is-functional-programming-good)可能更重要。 –

回答

9

不變性(你稱之爲單一賦值)簡化了很多事情,因爲它從程序中取出了「時間」變量。

例如,在數學,如果你說

x = y 

您可以替換爲xy,無處不在。在可操作的編程語言中,不能確保這種等式成立:每行代碼都有一個「時間」(狀態)。這個時候的狀態也會讓人不知所措,它是模塊化和併發的敵人之一。

欲瞭解更多信息,請參閱本:http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-20.html#%_sec_3.1.1

+0

對於SICP鏈接+1。 :) –

3

由於Single Assignment,副作用是微乎其微的。事實上,它很難在Erlang中用競爭條件或任何副作用編寫代碼。這是因爲編譯器易於告訴未使用的變量,創建的不使用的術語,陰影變量(特別是在funs之內)e.t.c.

Erlang在此獲得的另一個優勢是Referential Transparency。 Erlang中的函數只取決於傳遞給它的變量,而不取決於全局變量,除MACROS(並且宏在運行時不能更改,它們是常量)。

最後,如果你看了Erlang Movie,Erlang內置的Sophisticated Error Detection Mechanism很大程度上取決於在Erlang中,變量被賦值爲Once。

+2

但是請注意,Erlang中的函數並不完全透明:將消息發送到另一個進程可能會導致副作用,這會改變將來調用該函數的值。至於全局變量,還有進程字典,ETS表等。 –

+0

是的,Erlang一點也不透明,不變性只消除一種副作用(即編輯可能改變世界狀態的內存),但對於一般的副作用沒有限制。 –

2

讓變量保持它們的值使得理解和調試代碼變得更容易。對於併發進程,無論如何您都會遇到同樣的問題,因此無論如何,沒有任何變量可能隨時會改變其值,所以存在足夠的複雜性。把它看作封裝副作用,只有在明確時才允許它們。