代码之家  ›  专栏  ›  技术社区  ›  t0il3ts0ap

erlang中需要什么样的不可变/持久数据结构

  •  1
  • t0il3ts0ap  · 技术社区  · 7 年前

    每个Erlang进程维护自己的私有地址空间。所有的交流都是通过复制而不是共享来实现的 . 如果每个进程一次处理一条消息,而对其对象没有并发访问,我不明白为什么我们需要不可变的/ persistent data structures .

    3 回复  |  直到 7 年前
        1
  •  3
  •   aronisstav    7 年前

    事实上,在Erlang中,不变性并不能解决任何“共享状态”问题,因为不可变数据是“进程本地的”。

    然而,从这个角度来看,不变性提供了许多好处,在 this Quora answer :

    该定义使用数学意义上的函数,其中

    OO+可变性倾向于违反这个定义,因为 要更改一段数据,它通常不会返回输出,而是 很可能返回void或unit,并且当您调用

    至于范例有什么优势,可组合性,线程 完成等。

        2
  •  4
  •   Alexey Romanov    7 年前

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

    因此,添加可变的数据结构将需要大量的工作,可能会引入bug,而Erlang程序员几乎可以定义为至少愿意在没有它们的情况下生活。

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

        3
  •  0
  •   Roman Rabinovich    7 年前

    这是怎么回事?

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

    如果运行factorial(4),则单个进程将运行相同的函数。每次函数都有它自己的值X,如果X的值在进程的范围内,而不是函数,递归函数将不起作用。所以首先我们需要了解范围。如果您想说您不明白为什么数据需要在单个函数/块的范围内是不可变的,那么您会有一个观点,但是思考数据在哪里是不可变的,在哪里不是不可变的,这将是一个令人头痛的问题。