【问题标题】:What is the need for immutable/persistent data structures in erlangerlang中对不可变/持久数据结构的需求是什么
【发布时间】:2019-03-13 18:12:18
【问题描述】:

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

【问题讨论】:

  • 当您谈论“持久数据结构”时,您能举一些例子来说明您想到的 Erlang 数据结构吗?
  • 对于 scala/akka,persistent 仅在 actor 崩溃并需要重新启动时才需要,actor 在恢复时需要 persistent 设置其数据,也许 erlang 类似?顺便说一句,您可能需要删除 akka 标签?
  • @lagom 我不是在谈论将其持久化到数据库中。它与 fp 语言中的不可变数据结构有关。
  • @aronisstav 例如单链表。如果您只向头部添加元素,它是一个持久的数据结构。
  • @t0il3ts0ap 您是否也会使用“不可变”来描述与“持久”相同的想法?

标签: functional-programming erlang immutability


【解决方案1】:

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

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

许多人实际上认为他们的缺席是一件好事:减少对对象身份的关注,不需要防御性复制,因为您不知道其他一些代码是否会修改您传递的数据(或者可能会被更改)稍后修改它)等。

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

我记得很久以前看到 Joe Armstrong 的邮件列表帖子(我现在快速搜索找不到)说他最初计划在需要时添加可变变量...除了他从来没有这样做过,而且性能足以应付他使用 Erlang 的一切。

【讨论】:

    【解决方案2】:

    这将如何工作?

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

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

    【讨论】:

    • 您能否回答多个进程,其中需要不可变/持久的数据结构。
    【解决方案3】:

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

    然而,从函数式编程语言的角度来看,不变性提供了许多好处,this Quora answer 中充分总结了这一点:

    函数式编程最简单的定义是它是一种编程 使用函数转换不可变数据的范例。

    定义使用数学意义上的函数,它在哪里 接受输入并产生输出的东西。

    OO + 可变性往往会违反该定义,因为当您想要 改变一条数据它一般不会返回输出,它 可能会返回 void 或 unit,并且当您调用方法时 对象本身不是函数的输入。

    就范式有什么优势,可组合性,线程 安全,能够更好地跟踪哪里出了问题,能力 将数据与实际计算分开 完成等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      相关资源
      最近更新 更多