各种函数式编程语言有哪些优缺点?

3

我知道几种函数式编程语言 - F#、Lisp及其方言、R等等。然而,由于我从未使用过任何一种(尽管我提到的三种都在我的“学习”名单上),我想知道各种函数式编程语言的优缺点。在学习语言和实际应用中是否存在重大优缺点?


Haskell 应该是你前两名的选择。 - fuentesjr
那个评论对我比较各种函数式语言没有什么帮助。 - Thomas Owens
你学习新事物的容易程度主要取决于你自己和你已经掌握的知识。你正在编写什么样的程序?用于哪个平台?哪些限制对你很重要?这个问题几乎无法回答,范围太广了。 - Brian Carper
这个问题在这里被问了多少次? - StingyJack
如果你需要帮助的话,可以买本书,阅读文档,查阅计算机科学/学术期刊... - fuentesjr
5个回答

3

Haskell是一种“极端”(惰性、纯粹)的语言,拥有活跃的用户、大量文档和可执行应用程序。

SML是一种“不那么极端”(严格、非纯)、拥有活跃用户、正式规范和多种实现(SML/NJ、Mlton、Moscow ML等)。实现方式因应用而异,涉及运行时环境的部署方式。

OCaml是带有态度的ML。它具备面向对象的特性,拥有活跃用户、文档、附加组件和可执行应用程序。

Erlang是并发的、严格的、纯粹的(大多数情况下),支持分布式应用程序。它需要单独安装运行时环境,因此在部署方面与生成可执行文件的语言有所不同。

F#类似于具备Microsoft支持和.NET库的OCaml。

Scala在JVM上运行,既可以作为具备高级功能的函数式语言使用,也可以简单地作为超强版Java使用,或同时兼备两者。这种灵活性被认为是学习函数式语言的缺点之一,因为很容易滑回命令式Java的方式。当然,如果想要使用现有的JVM库,这也是一个优势。


Scala在这种分类中适合哪个位置? - Eddie
好问题,Eddie。我会添加的。 - Doug Currie

2
我不确定您的问题是关于一般的函数式语言,还是它们之间的区别。如果是关于函数式编程的一般信息,请参考以下内容:

http://paulspontifications.blogspot.com/2007/08/no-silver-bullet-and-functional.html

为什么函数式编程很重要

就函数式语言之间的区别而言:

函数式语言的独特特点

函数式语言的绝妙之处在于它们以λ演算和其他数学为基础。这导致可以更轻松地在不同语言之间使用相似的算法和思想。

就应该学习哪种语言而言:选择一个对你来说有舒适环境的语言。例如,如果你正在使用.NET和Visual Studio,则F#是一个非常好的选择。(实际上,VS集成使F#成为一个强有力的竞争者。)书籍“如何设计程序”(全文,免费,在线阅读),配合PLT Scheme也是一个不错的选择。

我有偏见,但 F# 看起来具有最大的“现实世界”潜力。这主要是因为它具有良好的 IDE/.NET 集成,允许您充分利用 .NET 和面向对象编程,同时保持很多函数式的优势(并以其他方式扩展它)。Scala 可能是一个有竞争力的选择,但它更像是一个具有一些函数式特性的面向对象语言;因此 Scala 不会带来如此大的生产力提升。
编辑:在有人评论之前,需要注意 JavaScript 和 Ruby。如果你正在进行那种类型的 Web 开发,Ruby 是另一个你可以考虑的东西,因为它包含了很多函数式概念,尽管不像其他语言那样精细。
最大的缺点是,一旦你看到你可以拥有的力量,你就不会满足于使用较差的语言。如果你被迫与还没有理解的人打交道,这将成为一个问题。
最后需要注意的是,唯一的“缺点”是“它太复杂了”。这实际上并不正确——函数式语言通常更简单——但如果你的脑海中已经有了多年的 C 或其他语言的经验,理解函数式概念可能是一个重要的障碍。一旦理解了,应该会相对顺利。

1

Lisp 具有平滑的学习曲线。你可以在一个小时内学会基础知识,当然要学习惯用语等需要更长时间。不过,Lisp 有许多方言,与主流环境如 Java 或 .NET 的交互困难。

我不建议使用 R,除非你需要进行统计分析。它是一种奇怪的语言,不完全是函数式的。你可以在 R 中进行函数式编程,但大多数人不这样做。

如果你熟悉 Microsoft 工具栈,那么 F# 可能很容易上手。而且它有一个巨大、经过充分测试的库,即 CLR。

你可以在任何语言中使用函数式编程风格,尽管有些语言比其他语言更容易实现。就这方面而言,你可以尝试 Python。


1
现在你可以使用像Clojure这样与JVM的互操作性非常好的Lisp语言 - 就我个人而言,我认为这种方法可以让你兼顾两者的优点。 - mikera

0

ML家族(SML/OCaml/F#):

优点:

  • 相当简单
  • 有有效的实现(与Java/C#水平相当)
  • 易于预测资源消耗(与惰性语言相比)
  • 可读性强的语法
  • 强大的模块系统
  • (对于F#):有大量的.Net库可用
  • 具有可变变量

缺点:

  • 有时过于简单(没有类型类=>存在重载问题)
  • (除了F#):标准库缺少一些有用的东西
  • 具有可变变量 :)
  • 不能有无限的数据结构(不是惰性语言)

我还没有提到大多数静态类型的函数式语言常见的特性:类型推断、参数化多态、高阶函数、代数数据类型和模式匹配。


请问您能详细解释一下“lazy”吗?在 F# 中,序列表达式可以是无限的数据结构,并且生成每个元素的代码直到请求该元素时才运行。如果这不被认为是“lazy”,我想了解其定义。 - Joel Mueller
当然你可以在严格语言中模拟惰性,但这需要额外的编码。我应该提到,“与Haskell相比,默认情况下不能有”。 - user57697

0

我在大学学习了Haskell这门纯函数式语言,我可以说它非常强大,但是我也找不到实际的用途。

然而,我发现了这个网站:Haskell in practice。看看吧,真的很棒。

函数式编程范式的特点有时候是优点,有时候是缺点,这取决于情境和背景。其中一些特点包括:

  • 高级别
  • lambda函数
  • 惰性求值
  • 高阶函数
  • 递归
  • 类型推断

引用自维基百科:

效率问题
函数式编程语言在CPU和内存的使用方面比C和Pascal等命令式语言效率低,这一点已经广为人知[26]。然而,对于那些进行大量数值计算的程序来说,像OCaml和Clean这样的函数式语言与C语言的速度相似。对于处理大型矩阵和多维数据库的程序,设计了具有速度优化功能的数组函数式语言(如J和K)。
纯函数式语言被认为比命令式语言更慢。然而,在许多情况下,数据的不可变性可以提高执行效率,使编译器能够做出在命令式语言中不安全的假设,从而大大增加内联的机会。
惰性求值也可以加速程序,即使是渐近的,而且最多只能使其减速一个常数因子(然而,如果使用不当,它可能会引入内存泄漏)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接