2013-03-27 145 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,并创建一个新的列表来影响旧的。

因此,每次绑定新的值声明时,它都会创建一个包含所有当前名称/值绑定的新环境。这些绑定中没有一个可以改变,它们只是被隐藏起来。