Ser*_*nov 19 erlang f# haskell functional-programming clojure
众所周知,所有函数语言都共享一些基本属性,例如使用函数作为程序的基本构建块,具有使用递归而不是迭代的所有后果.但是,也存在一些基本差异.Lisp对Lisp代码和数据使用单个表示,而ML没有ML代码的标准表示.Erlang有一个内置的基于actor的并发.Haskell有monad.Haskell在纯函数和不纯函数之间对静态类型系统进行了区分; ML没有.
其他功能语言(Clojure,F#,Arc,还是其他语言)之间有什么明显的根本区别?从根本上来说,我的意思是影响你在这种语言中发展的方式,而不是例如它是否与一些广泛的运行时集成.
Chr*_*way 26
脱离我的头顶:
只有前两个项目对于函数式语言来说才是真正独特的(即,几乎所有命令式语言都非常渴望和不纯粹).
Bri*_*ian 14
我喜欢克里斯康威的答案,其中说明了一些有助于对不同功能语言进行分类的重要轴.
在特定语言的功能方面,我会选择F#来调出许多其他FPL中没有的功能:
在一般分类方面,F#是
你的问题的表达方式明显偏向某些语言外的语用学(例如它与运算符集成在一起),但你也会问"影响你的发展方式",这些事情会影响到:
(我认为尝试将语言与运行时和工具分开是一项主要的学术练习.)
因此,我描述了一种特定语言的许多独特特征,我是其中的粉丝.我希望其他人可能会发布类似的答案,这些答案可以说明其他语言的独特特征
非严格与严格的评估.
静态与动态类型.
结构与名义静态类型.OCaml是我能想到的结构类型(在对象和多态变体中)的唯一语言,它通过消除定义许多类型(例如变体类型)的需要来填补动态类型的空白.
Hindley-Milner衍生物与其他静态类型推理算法.SML,OCaml,Haskell和F#使用基于Hindley-Milner的类型推断算法,而Scala只有本地类型推断(如C#3),需要更多的注释才能编译.(Haskell代码在函数级别通常充满了类型注释,但大多数是不必要的,并且是为了文档而添加的,并且在出现错误时帮助编译器).
模式匹配与手动解构.SML,OCaml,F#,Haskell,Mathematica和Scheme自动化了价值的解构.
封闭的总和类型与仅开放的总和类型.SML,OCaml,F#和Haskell允许定义封闭/密封的代数类型,以通过隐含地传达更具体的约束来加强静态类型.OCaml和F#也允许开放和类型,而SML不允许和Haskell需要精心设计的解决方法(由Oleg Kiselyov描述).
有限时间模式.在SML和(vanilla)OCaml中模式匹配非常快,但由于Mathematica中的活动模式甚至未知的渐近复杂性,在F#中具有未知的性能.
即时编译到本机代码.F#,Lisp和Scheme允许在运行时有效地生成,编译和执行代码.
宏.OCaml,Mathematica,Lisp和Scheme是可扩展的语言.
标准化与专有.SML,Haskell 2010,Common Lisp和Scheme是标准化语言,而OCaml,Erlang,F#和Mathematica是专有的.
有许多不同之处,但只有两个不同之处,我将其归类为基础,因为它们会对您的开发产生重大影响: