erlang中对immutable/persistent数据结构的需求是什么

What is the need for immutable/persistent data structures in erlang

每个 Erlang 进程维护自己的私有地址 space。所有通信都是通过复制而不共享进行的 (大型二进制文件除外)。如果每个进程一次处理一条消息而没有对其对象的并发访问,我不明白为什么我们需要不可变/persistent data structures.

这将如何运作?

factorial(1) -> 1;
factorial(X) ->
    X*factorial(X-1).

如果你 运行 factorial(4),单个进程将 运行ning 相同的函数。每次函数都会有它自己的 X 值,如果 X 的值在过程范围内而不是函数递归函数将不起作用。所以首先我们需要了解作用域。如果你想说你不明白为什么数据需要在单个 function/block 的范围内是不可变的你会说得有道理,但是想想数据在哪些地方是不可变的,在什么地方是不可变的会很头疼不是。

在 Erlang 中,不可变性确实不能解决任何 "shared state" 问题,因为不可变数据是 "process local".

然而,从 函数式编程语言 的角度来看,不变性提供了许多好处,this Quora answer:

中对此进行了充分总结

The simplest definition of functional programming is that it’s a programming paradigm where you are transforming immutable data with functions.

The definition uses functions in the mathematical sense, where it’s something that takes an input, and produces an output.

OO + mutability tends to violate that definition because when you want to change a piece of data it generally will not return the output, it will likely return void or unit, and that when you call a method on the object the object itself isn’t input for the function.

As far as what advantages the paradigm has, composability, thread safety, being able to track what went wrong where better, the ability to sort of separate the data from the actual computation on it being done, etc.

Erlang 最初是在 Prolog 中实现的,它也没有真正使用可变数据结构(尽管有些方言使用)。所以它在没有他们的情况下开始了。这使得运行时实现更简单、更快速(尤其是垃圾收集)。

因此,添加可变数据结构需要付出很多努力,可能会引入错误,而且根据定义,Erlang 程序员几乎愿意至少在没有它们的情况下生活。

许多人实际上认为它们的缺席是一个积极的好处:对对象身份的关注较少,不需要防御性复制,因为您不知道其他一些代码是否会修改您传递的数据(或者可能以后再改修改吧)等

这种缺席确实意味着 Erlang 在某些领域(例如高性能科学计算)是非常不可用的,至少作为主要语言是这样。但同样,这意味着这些领域中没有人会首先使用 Erlang,因此没有特别的动机以让现有用户不满意为代价来使其可用。

我记得很久以前看到过 Joe Armstrong 的邮件列表 post(我现在无法通过快速搜索找到它)说他最初计划在他需要时添加可变变量需要它们...除了他从来没有真正做到过,而且性能足以满足他使用 Erlang 的所有目的。