Zub*_*air 21 erlang functional-programming
我一直听说Erlang是一种函数式语言,但很容易从函数中调用数据库或非副作用的免费代码,并且命令很容易通过在它们之间使用","逗号,就像Ruby或其他语言一样,那么Erlang的"功能"部分在哪里?
Ric*_*rdC 34
中心思想是每个进程都是一个输入消息流的功能程序.功能程序的结果是向其他人输出消息流.从这个角度来看,Erlang是一种相当简洁的功能语言; 数据结构没有破坏性的更新(比如Lisp和大多数方案中的setcar).
除了少数例外,所有内置函数(如ETS表上的操作)也遵循此模型:除了效率问题之外,这些BIF实际上可以通过纯Erlang进程和消息传递实现.
所以,是的,Erlang语言是功能性的,但是一组互动的Erlang进程是另一回事.每个进程都是一个持续的计算,因此它具有当前状态,该状态可以相对于其他进程而改变.即便是数据库也只是这方面的另一个过程.
在我看来,这是关于Erlang最重要的事情之一:在这个过程之外,可能会有风暴肆虐,但在内部,事情很平静,让你专注于那个过程应该做什么 - 只有那样.
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:
任何真正纯粹的FP语言都是玩具语言或某人的研究项目.
也就是说,除非你的"有用"的想法是将所有内容保存在ghciREPL中.如果你愿意,你可以使用Haskell像一个美化的计算器,所以它是纯粹的FP.
是的,它是一种功能语言.它不是像Haskell那样纯粹的函数式语言,但是再一次,LISP也没有(并且没有人真正认为LISP不起作用).
Erlang的消息传递/进程处理是Actor模型的实现.你可以说Erlang是一种演员语言,其功能语言用于各个演员.