我现在正在努力掌握Erlang,这是我研究的第一种函数式编程语言,我注意到在Erlang中,你做的每一个赋值都是一个单独的赋值。显然,不仅在Erlang中,在许多其他函数式编程语言中,赋值都是通过一个单独的赋值来完成的。我真的很困惑,为什么他们会这样做。单一任务的目的到底是什么?我们能从中得到什么好处?
igsr9ssn1#
不变性(你称之为单赋值),简化了很多事情,因为它从你的程序中取出了“时间”变量。例如,在数学中,如果你说
x = y
你可以在任何地方用y替换x,但在运算编程语言中,你不能保证这个等式成立:每一行代码都有一个“时间”(状态)。这个时间状态也为不需要的side effects敞开了大门,side effects是模块化和并发性的头号敌人。有关详细信息,请参阅此。
y
x
rjzwgtxy2#
由于使用了单赋值,副作用非常小。事实上,在Erlang中编写带有争用条件或任何副作用的代码非常困难。这是因为,编译器很容易告知未使用的变量、未使用的创建项、阴影变量(特别是在funs中)等。Erlang的另一个优势是Referential Transparency,Erlang中的函数只依赖于传递给它的变量,而不依赖于全局变量,除了MACROS(宏在运行时不能改变,它们是常量)。最后,如果你看过Erlang Movie,内置在Erlang中的Sophisticated Error Detection Mechanism非常依赖于这样一个事实,即在Erlang中,变量被赋值一次。
funs
MACROS
Sophisticated Error Detection Mechanism
xjreopfe3#
让变量保持它们的值会使代码更容易理解和调试。使用并发进程,你会遇到同样的问题,所以无论如何,有足够的复杂性,而不是让任何变量在任何时候都可能改变它的值。可以把它看作是封装副作用,只允许显式的副作用。
3条答案
按热度按时间igsr9ssn1#
不变性(你称之为单赋值),简化了很多事情,因为它从你的程序中取出了“时间”变量。
例如,在数学中,如果你说
你可以在任何地方用
y
替换x
,但在运算编程语言中,你不能保证这个等式成立:每一行代码都有一个“时间”(状态)。这个时间状态也为不需要的side effects敞开了大门,side effects是模块化和并发性的头号敌人。有关详细信息,请参阅此。
rjzwgtxy2#
由于使用了单赋值,副作用非常小。事实上,在Erlang中编写带有争用条件或任何副作用的代码非常困难。这是因为,编译器很容易告知未使用的变量、未使用的创建项、阴影变量(特别是在
funs
中)等。Erlang的另一个优势是Referential Transparency,Erlang中的函数只依赖于传递给它的变量,而不依赖于全局变量,除了
MACROS
(宏在运行时不能改变,它们是常量)。最后,如果你看过Erlang Movie,内置在Erlang中的
Sophisticated Error Detection Mechanism
非常依赖于这样一个事实,即在Erlang中,变量被赋值一次。xjreopfe3#
让变量保持它们的值会使代码更容易理解和调试。使用并发进程,你会遇到同样的问题,所以无论如何,有足够的复杂性,而不是让任何变量在任何时候都可能改变它的值。可以把它看作是封装副作用,只允许显式的副作用。