我是函数式编程的新手,我真的无法理解“不可变”的概念 例如,在SML中:
val a = 3
val a = a+1
根据SML的原则,最后一行不会“改变”变量a的值,但是现在等于4, 有人可以帮我解释一下吗?什么是“无突变”的好处?
答案 0 :(得分:6)
当我们说变量是不可变的时,我们的意思是它自己的值不能改变。
你在那里展示的是什么val a = 3
val a = a+1
是:a
的新值只是“遮蔽”a
的旧值。 a
只是绑定到3
的名称,而在第二行中,它绑定到4
。 a
的旧值仍然存在,它只是无法访问。
如果您使用某种数据结构,可以更明显地看到这一点。没有像许多其他语言中看到的变异方法。例如,如果您有一个列表val L = [1,2,3]
,则无法更改L
中的第一个值。您必须完全隐藏L
,并创建一个新列表以遮蔽旧列表。
因此,每次绑定新的值声明时,它都会创建一个包含所有当前名称/值绑定的新环境。这些绑定都不能改变,它们只是被遮蔽了。