Erlang"单一赋值"与Haskell"不可变值"不同吗?

bas*_*ode 15 erlang haskell functional-programming

在"编程Erlang"一书中,它说该语言使用"单一赋值"变量.在关于函数式编程语言的其他文章中,我总是读到"不可变值".

措辞"单一分配"是否意味着与"不可变价值"不同的东西?

sch*_*sch 17

在erlang中,变量可以是绑定的也可以是非绑定的.您只能为未绑定的变量赋值.而这就是单一赋值的来源,因为一旦变量被绑定,您就不能再为其赋值.因此,在二郎,你不能做到以下几点,即使01是不变的值.

X = 1.
X = 2. // This is not a valid operation
Run Code Online (Sandbox Code Playgroud)

术语不可变是相对于变量的值,而不是变量本身.因此在某些语言中,您可以为不同的值分配不同的值:

X = immutableValue;
X = anotherImutableValue; // This is a valid operation
Run Code Online (Sandbox Code Playgroud)

编辑:来自维基百科

不可变对象:

在面向对象和函数式编程中,不可变对象是一个对象,其状态在创建后无法修改.

单一作业:

单一赋值是名称绑定的一个示例,它与本文所述的赋值不同之处在于它通常只能创建一次,通常是在创建变量时; 不允许后续的重新分配.[...]一旦通过单一赋值创建,命名值不是变量而是不可变对象.

  • 在Erlang中,`=`是模式匹配运算符.当变量未绑定时,它的行为类似于赋值.`=:=`和`==`用于等式测试. (8认同)

ber*_*eal 7

差异与(重新)绑定变量和变异值之间的差异有关.

"单一赋值"意味着您不能使用不同的值重新绑定变量,例如:

1> A = 1.
2> A = 2.
** exception error: no match of right hand side value 2
Run Code Online (Sandbox Code Playgroud)

另一方面,"不可变值"意味着您不能自己更改(例如,从并行线程),因此如果您想要修改列表,则必须创建一个副本或语义等效的内容而不是更改到位.