什么是"不可变变量"在函数式编程中意味着什么

nzo*_*xia 3 functional-programming immutability

我是函数式编程的新手,我真的无法理解"不可变"的概念.
例如,在SML中:

val a = 3
val a = a+1
Run Code Online (Sandbox Code Playgroud)

根据SML的原则,最后一行不会"改变"变量a的值,但现在等于4,有人可以为我解释一下吗?什么是"无突变"的好处?

AVP*_*AVP 6

当我们说变量是不可变的时,我们的意思是它自己的值不能改变.你在那里展示的是什么

val a = 3
val a = a+1
Run Code Online (Sandbox Code Playgroud)

是:新的价值a只是"遮蔽"旧的价值a.a只是一个绑定的名称,3在第二行,它是绑定的4.旧的价值a仍然存在,它只是无法访问.

如果您使用某种数据结构,可以更明显地看到这一点.没有像许多其他语言中看到的变异方法.例如,如果您有一个列表val L = [1,2,3],那么就无法更改第一个值L.您将不得不L完全隐藏阴影,并创建一个新列表来遮蔽旧列表.

因此,每次绑定新的值声明时,它都会创建一个包含所有当前名称/值绑定的新环境.这些绑定都不能改变,它们只是被遮蔽了.