Functional programming Erlang真的是函数式语言吗?

Functional programming Erlang真的是函数式语言吗?,functional-programming,erlang,Functional Programming,Erlang,我一直听说Erlang是一种函数式语言,但是从函数中调用数据库或无副作用的代码很容易,而且命令可以很容易地通过使用“,”来排序,就像Ruby或其他语言一样,那么“函数式”在哪里呢Erlang的一部分?功能部分是您倾向于传递函数。大多数语言既可以用作函数式语言,也可以用作命令式语言,甚至可以用作C语言(很有可能使程序只包含函数指针和常量) 我想区别因素通常是函数式语言中缺少可变变量。中心思想是每个进程都是一个输入消息流上的函数程序。功能程序的结果是向其他程序输出消息流。从这个角度来看,Erlang

我一直听说Erlang是一种函数式语言,但是从函数中调用数据库或无副作用的代码很容易,而且命令可以很容易地通过使用“,”来排序,就像Ruby或其他语言一样,那么“函数式”在哪里呢Erlang的一部分?

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


我想区别因素通常是函数式语言中缺少可变变量。

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

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

是的,Erlang语言是功能性的,但是交互Erlang进程的集合是另一回事。每个进程都是一个正在进行的计算,因此它有一个当前状态,该状态可以相对于其他进程进行更改。在这方面,即使是数据库也只是另一个过程


在我看来,这是关于Erlang最重要的事情之一:在进程之外,可能会有一场风暴肆虐,但在进程内部,一切都很平静,让您能够专注于该进程应该做什么——而且仅此而已。

是的,它是一种函数式语言。它不像Haskell那样是一种纯粹的函数式语言,但话说回来,LISP也不是(也没有人真正认为LISP不是函数式的)


Erlang的消息传递/进程处理是Actor模型的一个实现。你可以说Erlang是一种参与者语言,每个参与者都使用一种函数式语言。

函数式语言必须有一个模因,但我要说的是,任何使用它的语言都是函数式编程语言

对值的易变性和副作用进行强有力的控制是非常有用和强大的,但我相信这些都是函数式编程的外围因素。拥有很好,但不是必需的。即使在具有这些属性的语言中,也总有一种方法可以逃避范式的纯洁性。1

在真正纯粹的FP语言(你不能实际用于任何实际用途)和真正非常不纯净但仍具有某些FP性质的语言之间存在一个灰度连续统:

  • Book FP:关于FP语言的介绍性书籍通常只显示该语言的一个子集,所有示例都是在该语言的内部完成的,因此您永远不会看到纯粹的函数范式被打破。这一方案的一个很好的例子如中所示

    你可能会在阅读这样一本书时产生错误的印象,以为FP语言实际上不能做任何有用的事情

  • Haskell:Haskell的创造者们不遗余力地通过著名的。墙一侧的所有内容都是纯功能性的,因此编译器可以自信地对代码进行推理

    但重要的是,尽管存在这堵墙,但您必须使用I/O monad在Haskell中完成任何有用的操作。2从这个意义上说,Haskell并不像某些人希望您相信的那样“纯洁”。I/O monad允许您在Haskell中构建任何您喜欢的“不纯”软件:数据库客户端、高状态GUI等

  • Erlang:具有不可变的值和一流的函数,但在核心语言和不纯位之间缺乏一道坚固的墙

    Erlang附带了一个磁盘备份的内存DBMS,它和软件一样不纯。实际上,它与商店几乎没有什么不同。Erlang还非常支持通过等与外部程序通信

    Erlang不会在语言级别对程序员强加任何类型的纯度策略。它只是给你工具,让你决定如何使用它们

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

    命令式编程位允许您使用可变计数器变量编写传统的
    for
    循环,而纯FP程序可能会尝试在列表上递归以实现相同的结果

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

    如果将F#与.NET一起使用,那么您将一直在变异值,因为.NET的大部分都是可变的,以某种方式。例如,任何具有可设置属性的.NET对象都是可变的,所有GUI内容本身都有副作用。NET中唯一一个立即浮现在脑海中的不变部分是

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

  • JavaScript、R、Lua、Perl……:有许多语言甚至不如OCaml那么纯粹,从某种意义上说,它们仍然可以被认为是功能性的。此类语言具有一流的函数,但默认情况下值是可变的


Foototes:

  • 任何真正纯粹的FP语言都是一种语言或某人的研究项目

  • 也就是说,除非你的“有用”的想法是保持e