Erlang真的是一种功能语言吗?

Zub*_*air 21 erlang functional-programming

我一直听说Erlang是一种函数式语言,但很容易从函数中调用数据库或非副作用的免费代码,并且命令很容易通过在它们之间使用","逗号,就像Ruby或其他语言一样,那么Erlang的"功能"部分在哪里?

Ric*_*rdC 34

中心思想是每个进程都是一个输入消息流的功能程序.功能程序的结果是向其他人输出消息流.从这个角度来看,Erlang是一种相当简洁的功能语言; 数据结构没有破坏性的更新(比如Lisp和大多数方案中的setcar).

除了少数例外,所有内置函数(如ETS表上的操作)也遵循此模型:除了效率问题之外,这些BIF实际上可以通过纯Erlang进程和消息传递实现.

所以,是的,Erlang语言是功能性的,但是一组互动的Erlang进程是另一回事.每个进程都是一个持续的计算,因此它具有当前状态,该状态可以相对于其他进程而改变.即便是数据库也只是这方面的另一个过程.

在我看来,这是关于Erlang最重要的事情之一:在这个过程之外,可能会有风暴肆虐,但在内部,事情很平静,让你专注于那个过程应该做什么 - 只有那样.

  • 我认为Joe Armstrong通常会调用Erlang Functional Erlang,Concurrent Erlang,SMP Erlang,Distributed Erlang和Reliable Erlang的子语言,其中每个子语言都是之前的一个正确的超集.因此,功能Erlang是在Actor内运行的,它纯粹是功能性的.并发Erlang就是当你有多个Actors时,SMP Erlang就是当你有多个调度程序(即多个CPU核心)时,分布式Erlang就是当你有多个节点时,可靠的Erlang就是当你使用supervisor树和所有这些东西时.自发送以来,只有第一个是纯功能的 (9认同)
  • 是的......但是演员模型与函数式语言有什么关系呢? (5认同)
  • 进程隔离和缺少共享状态是Actor模型的关键属性之一.我喜欢演员模特. (4认同)
  • 我现在对其中的演员部分感到困惑。我猜称语言为“功能性”并不意味着它是100%功能性的。演员之间的关系如何? (2认同)
  • 这取决于你认为是什么"语言".Erlang中的actor模型(进程及其当前状态和输出)可以被认为是在语言之外的另一个层次上,在这种情况下,Erlang显然应该被称为功能.但如果你把演员模型视为"语言"的一部分,那么你就会突然处理效果,时间和非确定性.这让一些人说"哦,但Erlang使用副作用".答案是肯定和否定. (2认同)
  • ...消息*是*一种副作用。 (2认同)
  • @JörgWMittag ...除了即使在演员内部也允许任意副作用,这_不会使其成为纯粹的功能。 (2认同)

War*_*ung 16

有一个模因,函数式语言必须具有不可变的值并且没有副作用,但我说任何具有一等函数的语言都是函数式编程语言.

对值可变性和副作用进行强有力的控制是有用且强大的,但我相信这些是函数式编程的外围设备.很高兴,但不是必不可少的.即使在具有这些属性的语言中,总有一种方法可以逃避范式的纯粹性.1

真正纯粹的FP语言之间存在灰度连续性,你实际上并不能用于任何实用的语言,而且这些语言实际上非常不纯,但仍然具有一些FP性质:

  • 书FP:关于FP语言的入门书籍经常只显示该语言的一个子集,所有的例子都在语言的REPL中完成,这样你就永远不会看到纯粹的功能范式被打破.一个很好的例子就是The Little Schemer中提出的Scheme .

    您可以放弃阅读这样一本书,误以为FP语言实际上无法做任何有用的事情.

  • Haskell:Haskell的创造者通过着名的I/O monad进行了不寻常的长度来消除杂质.墙的一侧的所有东西都是纯粹的功能,因此编译器可以自信地对代码进行推理.

    但重要的是,尽管存在这样的墙,你必须使用I/O monad 在Haskell中完成任何有用的工作.2从这个意义上讲,哈斯克尔并不像你想要的那样"纯洁".I/O monad允许您在Haskell中构建任何类型的"不纯"软件:数据库客户端,高度有状态的GUI等.

  • Erlang:具有不可变值和一等函数,但在核心语言和不纯的位之间缺乏强大的支持.

    Erlang附带Mnesia,这是一个磁盘支持的内存数据库管理系统,它与软件一样不可靠.它在实践中与全球变量商店几乎没有什么不同.Erlang还非常支持通过端口,套接字等与外部程序进行通信.

    Erlang没有对您(程序员)在语言层面施加任何纯度政策.它只是为您提供工具,让您决定如何使用它们.

  • OCaml和F#:这些密切相关的多范式语言既包括纯粹的功能元素,也包括命令式和面向对象的特性.

    命令式编程位允许您执行诸如for使用可变计数器变量编写传统循环之类的操作,而纯FP程序可能会尝试递归列表而不是完成相同的结果.

    如果没有mutable关键字,OO部分几乎没用,它会将定义转换为变量,这样如果更改变量的值,编译器就不会抱怨.OCaml和F#中的可变变量有一些限制,但您可以使用ref关键字来逃避这些限制.

    如果你在.NET上使用F#,你将会一直在改变值,因为大多数.NET都是以某种方式变化的.例如,具有可设置属性的任何.NET对象都是可变的,并且所有GUI内容本身都具有副作用.立即浮现在脑海中的唯一不可改变的部分是System.String.

    尽管如此,没有人会认为OCaml和F#不是函数式编程语言.

  • JavaScript,R,Lua,Perl ......:有许多语言甚至比OCaml更纯净,在某种意义上它仍然可以被认为是功能性的.这些语言具有一流的功能,但默认情况下值是可变的.


Foototes:

  1. 任何真正纯粹的FP语言都是玩具语言或某人的研究项目.

  2. 也就是说,除非你的"有用"的想法是将所有内容保存在ghciREPL中.如果你愿意,你可以使用Haskell像一个美化的计算器,所以它是纯粹的FP.

  • 拥有"一流功能"并不能成为语言FP.函数编程中的"功能"部分是指_mathematical_function,意思是每个输入都有单个输出的函数.然后,此属性为您提供参照透明度,不变性,从而导致等式推理.如果你想要一个术语"用非数学函数编程",那么一个更好的术语是"程序编程".否则"FP Languages"是那些积极鼓励使用FP的人.JS,R,Lua,Perl永远不会获得资格.请不要为营销目的稀释条款. (3认同)
  • @AlexandruNedelcu:我在上面提到了关于逃避范式纯洁性的评论。我的意思是,任何实用的 FP 语言都可以让您编写违反数学理想的程序。如果你坚持这个定义,那么即使是 Haskell 也不是 FP。因此你的定义是站不住脚的。 (2认同)

kyo*_*ryu 8

是的,它是一种功能语言.它不是像Haskell那样纯粹的函数式语言,但是再一次,LISP也没有(并且没有人真正认为LISP不起作用).

Erlang的消息传递/进程处理是Actor模型的实现.你可以说Erlang是一种演员语言,其功能语言用于各个演员.

  • 我很确定Haskell社区中有人认为Lisp不起作用.Lisp社区中也有人认为 - 事实上,CommonLisp社区坚决认为CommonLisp是一种多范式语言. (4认同)