2013-03-27 139 views
2

我是函數式編程的新手,我真的無法理解「不可變」的概念。
例如,在SML:什麼是「不可變變量」意味着函數式編程

val a = 3 
val a = a+1 

根據SML的原則,最後一行不變量的「變化」的價值,但等於4,現在, 誰能請解釋我? 「沒有突變」的好處是什麼?

+2

第二個'a'是一個新的變量,它恰好與前一個變量一樣被調用,因此在嵌套的上下文中將其隱藏。編譯器會重寫這段代碼,就像'let a000 = 3 in let a001 = a000 + 1 in ...' – 2013-03-27 08:51:27

+0

那麼這意味着它們指向不同的內存位置?我能找回第一個「a000」嗎? – nzomkxia 2013-03-27 09:38:25

+1

你甚至不應該在「記憶位置」方面考慮這樣的變量(無論如何它們都是常量,因此可能會被摺疊)。由於名稱被屏蔽,除非您退出屏蔽定義上下文,否則您將無法獲得原始的背景。讓a = 1讓b =(讓a = a + 1在/ * a中爲2 * /)在a/* b中被遺忘,返回原來的a * /' – 2013-03-27 09:49:17

回答

4

當我們說一個變量是不可變的時,我們的意思是它自己的值不能改變。你正在展示與

val a = 3 
val a = a+1 

有:中a新的值就是「陰影」的a舊值。 a只是一個綁定到3的名稱,在第二行中,它綁定到4。舊的價值a仍然存在,它只是無法訪問。

如果您使用某種數據結構,可以更明顯地看到這一點。沒有像你在其他許多語言中看到的增變器方法。例如,如果您有一個列表val L = [1,2,3],那麼無法更改L中的第一個值。你將不得不完全影響L,並創建一個新的列表來影響舊的。

因此,每次綁定新的值聲明時,它都會創建一個包含所有當前名稱/值綁定的新環境。這些綁定中沒有一個可以改變,它們只是被隱藏起來。