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

时间:2010-02-16 08:15:15

标签: functional-programming erlang

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

4 个答案:

答案 0 :(得分:32)

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

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

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

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

答案 1 :(得分:16)

有一个模因,函数式语言必须immutable values并且是side-effect free,但我说任何带有first-class functions的语言都是函数式编程语言。

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

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

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

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

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

    但重要的是,尽管存在这样的墙,你必须使用I / O monad在Haskell中完成任何有用的 2 在那里感觉,Haskell并不像你想要的那样“纯粹”。 I / O monad允许您在Haskell中构建任何类型的“不纯”软件:数据库客户端,高度有状态的GUI等。

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

    Erlang附带Mnesia,这是一个磁盘支持的内存数据库管理系统,它与软件一样不可靠。实际上与global variable商店几乎没有什么不同。 Erlang还非常支持通过portssockets等与外部程序进行通信。

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

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

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

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

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

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

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


<强> Foototes:

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

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:2)

功能部分是你倾向于传递函数。大多数语言既可以用作函数语言,也可以用作命令式语言,甚至是C语言(很可能只创建一个只包含函数指针和常量的程序)。

我认为区别因素通常是功能语言中缺少可变变量。