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

Functional programming erlang中需要什么样的不可变/持久数据结构,functional-programming,erlang,immutability,Functional Programming,Erlang,Immutability,每个Erlang进程维护自己的私有地址空间。除了大型二进制文件外,所有通信都是通过复制进行的,没有共享。如果每个进程一次处理一条消息,而对其对象没有并发访问,我不明白为什么我们需要不可变的/这是如何工作的 factorial(1) -> 1; factorial(X) -> X*factorial(X-1). 如果运行factorial4,则单个进程将运行相同的函数。每次函数都有它自己的值X,如果X的值在进程的范围内,而不是函数,递归函数将无法工作。所以首先我们需要了解范围

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

这是如何工作的

factorial(1) -> 1;
factorial(X) ->
    X*factorial(X-1).
如果运行factorial4,则单个进程将运行相同的函数。每次函数都有它自己的值X,如果X的值在进程的范围内,而不是函数,递归函数将无法工作。所以首先我们需要了解范围。如果您想说您不明白为什么数据需要在单个函数/块的范围内是不可变的,那么您会有一个观点,但是考虑数据在哪里是不可变的,在哪里不是,这将是一件令人头痛的事情

这将如何工作

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

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

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

然而,从函数式编程语言的角度来看,不变性提供了许多好处,具体概括如下:

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

该定义使用数学意义上的函数,其中 接受输入并产生输出的东西

OO+可变性倾向于违反这个定义,因为 要更改一段数据,它通常不会返回输出 将很可能返回void或unit,并且在 对象本身不是函数的输入

就范例的优势而言,可组合性、线程 安全性,能够更好地跟踪哪里出了问题 将数据从正在进行的实际计算中分离出来 完成等


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

然而,从函数式编程语言的角度来看,不变性提供了许多好处,具体概括如下:

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

该定义使用数学意义上的函数,其中 接受输入并产生输出的东西

OO+可变性倾向于违反这个定义,因为 要更改一段数据,它通常不会返回输出 将很可能返回void或unit,并且在 对象本身不是函数的输入

就范例的优势而言,可组合性、线程 安全性,能够更好地跟踪哪里出了问题 将数据从正在进行的实际计算中分离出来 完成等


Erlang最初是在Prolog中实现的,虽然有些方言使用可变数据结构,但Prolog也没有真正使用可变数据结构。所以它开始时没有他们。这使得运行时实现更简单,尤其是垃圾收集更快

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

许多人实际上认为他们的缺席是一个积极的好处:对对象身份的关注较少,不需要进行防御复制,因为你不知道其他代码是否会修改你所通过的数据,或者可能在以后修改它,等等。

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


我记得很久以前看到过Joe Armstrong的邮件列表帖子,我现在快速搜索都找不到,说他最初计划在需要时添加可变变量。。。除了他从来没有做到这一点,而且对于他所使用的Erlang来说,性能已经足够好了。

Erlang最初是在Prolo中实现的 g、 虽然有些方言使用可变数据结构,但它也没有真正使用可变数据结构。所以它开始时没有他们。这使得运行时实现更简单,尤其是垃圾收集更快

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

许多人实际上认为他们的缺席是一个积极的好处:对对象身份的关注较少,不需要进行防御复制,因为你不知道其他代码是否会修改你所通过的数据,或者可能在以后修改它,等等。

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


我记得很久以前看到过Joe Armstrong的邮件列表帖子,我现在快速搜索都找不到,说他最初计划在需要时添加可变变量。。。除了他从未完全做到这一点,而且对于他使用Erlang所做的一切,性能都足够好。

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