众所周知,所有函数式语言共享一些基本属性,例如使用函数作为程序的基本构建块,具有使用递归而不是迭代等所有后果。但是,也存在一些基本差异。 Lisp对Lisp代码和数据使用单个表示,而ML没有ML代码的标准表示。 Erlang有一个内置的基于actor的并发。 Haskell有monad。 Haskell在静态类型系统中区分了纯函数和不纯函数; ML没有。
其他功能语言(Clojure,F#,Arc,还是其他)之间有哪些独特的基本差异?从根本上说,我的意思是影响你在这种语言中发展的方式,而不是,例如,它是否与某种广泛的运行时集成。
答案 0 :(得分:25)
脱离我的头顶:
只有前两个项目对于函数式语言来说才是真正独特的(即,几乎所有命令式语言都是渴望和不纯的)。
答案 1 :(得分:14)
我喜欢Chris Conway的回答,其中说明了一些有助于对不同功能语言进行分类的重要轴。
就特定语言的功能而言,我会选择 F# 来调出许多其他FPL中没有的功能:
就一般分类而言,F#是
你的问题的表达方式明显偏向某些语言外语用语(例如它与运行时集成的内容),但你也会问“影响你的发展方式”,这些事情会影响到:< / p>
(我认为尝试将语言与其运行时和工具分开是一项主要的学术练习。)
所以我对一个特定语言的许多独特特征进行了描述。我希望其他人可能会发布类似的答案,这些答案可以说出其他语言的独特特征。
答案 2 :(得分:9)
非严格与严格评估。
静态与动态类型。
结构与名义静态类型。 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是专有的。
答案 3 :(得分:5)
存在许多差异,但只有两个差异我将其归类为基本,因为它们会对您的开发产生重大影响:
答案 4 :(得分:3)
功能编程是一种风格,而不是语言结构
大多数函数式语言都有一些共同的原则:
但最重要的原则是他们通常会强迫你以功能性的方式写作。您可以使用大多数语言编写功能样式。如果您像其他语言一样编写代码,C#可被视为“功能性”。
答案 5 :(得分:2)
基本属性?
第一个是美丽的,第二个是前者的丑陋副作用(双关语)。
对于缺乏国家的现实补偿是我发现功能语言之间最大的区别。
这几件事给了很多免费赠品。大多数情况下,语言处理memoization。
答案 6 :(得分:2)
当您将代码称为数据时,您指的是代码在数据结构中表示的语言。这被称为Homoiconicity,它通常仅适用于lisp方言或接近它的语言。 Haskell,Erlang和Scala不是Homoiconic,Clojure是。
Clojure的基本区别是:
它有一个软件事务内存系统,可以简化共享状态并发编程
它是一个Lisp,与Haskell或Erlang不同,因此所有代码都是数据,它允许您通过宏系统在运行时制作看起来像语言本身的更改
它在JVM上运行,这意味着您可以直接访问所有Java库
Clojure数据结构在适当的地方实现Java接口,如Collection,List,Map,Runnable和Callable。字符串只是Java字符串,数字是Java整数和双打。这意味着Clojure数据结构可以直接传递给Java库而无需任何桥接或翻译