单一作业的目的

时间:2012-06-29 03:21:39

标签: functional-programming erlang

我目前正在尝试掌握Erlang。这是我看到的第一个函数式编程语言,我注意到在Erlang中,你所做的每个任务都是一个赋值。显然,不仅在Erlang中,而且在许多其他函数式编程语言中,分配都是通过单一赋值完成的。

我真的很困惑为什么他们这样做。单一作业的目的究竟是什么?我们可以从中获得什么好处?

3 个答案:

答案 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)

让变量保持其值可以更容易理解和调试代码。对于并发进程,无论如何都会遇到同样的问题,因此无论如何都有足够的复杂性,而且任何时候都没有任何变量可能会改变它的值。将其视为封装副作用,只在显式时允许它们。