我目前正在尝试掌握Erlang。这是我看到的第一个函数式编程语言,我注意到在Erlang中,你所做的每个任务都是一个赋值。显然,不仅在Erlang中,而且在许多其他函数式编程语言中,分配都是通过单一赋值完成的。
我真的很困惑为什么他们这样做。单一作业的目的究竟是什么?我们可以从中获得什么好处?
答案 0 :(得分:9)
不变性(你称之为单一作业),简化了许多事情,因为它消除了"时间"来自你的程序的变量。
例如,在数学中如果你说
x = y
您可以在任何地方替换x
y
。在操作编程语言中,您无法确保这种平等性:有一个"时间" (状态)与每行代码相关联。这个时间状态也让不受欢迎的side effects敞开大门,这是模块性和并发性的最大敌人。
有关详细信息,请参阅:http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-20.html#%_sec_3.1.1
答案 1 :(得分:3)
由于Single Assignment,副作用非常小。事实上,在Erlang中编写具有竞争条件或任何副作用的代码非常困难。这是因为,编译器easilly告诉未使用的变量,创建未使用的术语,阴影变量(特别是在funs
内部)等等
乙二郎在此获得的另一个优势是{{ 3}}。 Erlang中的函数将仅依赖于传递给它的变量而不依赖于全局变量,除了MACROS
(并且宏不能在运行时更改,它们是常量。)。
最后,如果你看了Referential Transparency,那么Erlang中内置的Sophisticated Error Detection Mechanism
在很大程度上取决于在Erlang中,变量被赋值为Once。
答案 2 :(得分:2)
让变量保持其值可以更容易理解和调试代码。对于并发进程,无论如何都会遇到同样的问题,因此无论如何都有足够的复杂性,而且任何时候都没有任何变量可能会改变它的值。将其视为封装副作用,只在显式时允许它们。