我目前正在尝试掌握 Erlang。这是我研究的第一种函数式编程语言,我注意到在 Erlang 中,您所做的每个作业都是一个作业。显然,不仅在 Erlang 中,在许多其他函数式编程语言中,赋值都是通过单个赋值完成的。
我真的很困惑他们为什么会这样。单次分配的目的究竟是什么?我们能从中得到什么好处?
我目前正在尝试掌握 Erlang。这是我研究的第一种函数式编程语言,我注意到在 Erlang 中,您所做的每个作业都是一个作业。显然,不仅在 Erlang 中,在许多其他函数式编程语言中,赋值都是通过单个赋值完成的。
我真的很困惑他们为什么会这样。单次分配的目的究竟是什么?我们能从中得到什么好处?
不变性(你称之为单一赋值)简化了很多事情,因为它从你的程序中取出了“时间”变量。
例如,在数学中,如果你说
x = y
您可以在任何地方替换x
for y
。在操作编程语言中,您无法确保这种等式成立:每一行代码都有一个“时间”(状态)。这种时间状态也为不受欢迎的副作用敞开了大门,这是模块化和并发性的头号敌人。
有关更多信息,请参阅此。
由于Single Assignment,副作用非常小。事实上,在 Erlang 中编写具有竞争条件或任何副作用的代码非常困难。这是因为,编译器很容易告诉未使用的变量、未使用的已创建术语、阴影变量(尤其是内部funs
)等
Erlang 在这方面获得的另一个优势是参照透明性。Erlang 中的函数将仅依赖于传递给它的变量,而不依赖于全局变量,除了MACROS
(并且宏不能在运行时更改,它们是常量。)。
最后,如果你看过Erlang Movie, ErlangSophisticated Error Detection Mechanism
中内置的 很大程度上取决于在 Erlang 中,变量被分配一次的事实。
让变量保持它们的值可以更容易地理解和调试代码。对于并发进程,无论如何您都会遇到同样的问题,因此无论如何都会有足够的复杂性,而没有任何变量可能随时改变其值。将其视为通过仅在显式时允许它们来封装副作用。