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

时间:2009-01-30 21:04:41

标签: programming-languages functional-programming

我知道几种函数式语言--F#,Lisp及其方言,R等。但是,因为我从来没有使用它们(尽管我提到的三个都在我的“学习”列表中),我想知道各种功能语言的优点/缺点。在学习语言和所述语言的任何实际应用中是否有重要的优点/缺点?

5 个答案:

答案 0 :(得分:3)

Haskell是“极端”(懒惰,纯粹),拥有活跃的用户,大量的文档,并使可运行的应用程序。

SML“不那么极端”(严格,不纯),有活跃用户,正式规范,许多实现(SML / NJ,Mlton,Moscow ML等)。实现方式因运行时部署应用程序的方式而异。

OCaml是ML的态度。它具有面向对象,活动用户,文档,附加内容以及可运行的应用程序。

Erlang是并发的,严格的,纯粹的(大多数),并且支持分布式应用程序。它需要单独安装运行时,因此部署与生成可运行二进制文件的语言不同。

F#类似于OCaml与Microsoft支持和.NET库。

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

答案 1 :(得分:2)

我不确定你的问题是关于一般的函数式语言,还是它们之间的差异。有关功能原因的一般信息:

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

Why Functional Programming Matters

就功能语言之间的差异而言:

Distinctive traits of the functional languages

关于函数式语言的一个很棒的事情就是基于lambda演算和其他数学。这使得能够更容易地跨语言使用类似的算法和思想。

至于你应该学习哪一个:选择一个能为你提供舒适环境的人。例如,如果您使用的是.NET和Visual Studio,那么F#非常适合。 (实际上,VS整合使F#成为一个强有力的竞争者,期间。)PLT Scheme的书籍“How to Design Programs”(全文,免费,在线)也是一个不错的选择。

我有偏见,但F#看起来拥有最大的“真实世界”潜力。这主要是因为IDE / .NET集成很好,允许您充分利用.NET和OO,同时保持很多功能(并以同样的方式扩展)。 Scala可能是竞争者,但它更像是一种具有一些功能特征的OO语言;因此Scala的生产力不会那么大。

编辑:只是为了注意JavaScript和Ruby,在有人评论之前:)。如果你正在做那种类型的web开发,你可以看看Ruby,因为它有很多功能概念,虽然没有其他语言那么精致。

最大的缺点是,一旦你看到了你可以拥有的力量,你将不会喜欢使用较少的语言。如果你被迫与尚未理解的人打交道,这就成了一个问题。

最后一点,唯一的“骗局”是“它太复杂了”。这实际上并不正确 - 功能语言通常更简单 - 但如果你的大脑中有多年的C或其他东西,那么“获得”功能概念可能是一个重大障碍。点击之后,它应该是相对平稳的航行。

答案 2 :(得分:1)

Lisp有一个温和的学习曲线。你可以在一小时内学习基础知识,当然学习成语需要更长的时间等等。在不利的方面,有许多Lisp方言,很难与Java或.NET等主流环境进行交互。

除非你需要做统计,否则我不推荐R.这是一种奇怪的语言,并不完全正常。您可以在R中进行函数式编程,但大多数人不这样做。

如果您熟悉Microsoft工具堆栈,F#可能很容易进入。它背后有一个巨大的,经过良好测试的库,即CLR。

您可以在任何语言中使用函数式编程风格,但有些使其比其他语言更容易。就此而言,您可以尝试使用Python。

答案 3 :(得分:0)

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

优点:

  • 相当简单
  • 有效实施(在Java / C#级别上)
  • 轻松预测资源消耗(与懒惰语言相比)
  • 可读语法
  • 强大的模块系统
  • (对于F#):大型.Net库可用
  • 有可变变量

缺点:

  • 有时候太简单了(没有类别=>重载问题)
  • (F#除外):标准库缺少一些有用的东西
  • 有可变变量:)
  • 不能拥有无限的数据结构(不是懒惰的语言)

我没有提到大多数静态类型函数语言常见的特征:类型推断,参数多态,高阶函数,algrebraic数据类型&模式匹配。

答案 4 :(得分:0)

我在大学里学过Haskell就像一个纯粹的功能性语言,我可以说它非常强大,但我也找不到实际用途。

然而,我发现了这个:Haskell in practice。检查一下,真是太棒了。

功能范式的特征有时是优点,有时是缺点,取决于情况/背景。 其中一些是:

  • 高级别
  • lambda functions
  • 懒惰的评价
  • 高阶函数
  • 递归
  • 类型推断

来自维基百科:

  

效率问题

     

功能编程语言有   被认为效率低下   他们使用的CPU和内存比   命令式语言,如C和   帕斯卡。[26]但是,对于程序而言   执行密集的数字   计算,功能语言   如OCaml和Clean类似   速度为C.对   处理大型矩阵的程序   和多维数据库,数组   函数式语言(如J和K)   设计与速度优化   记住。

     

纯功能语言有   声誉比慢   命令式语言。   但是,数据的不变性可以在   很多情况下,导致执行   允许编译器的效率   做一些不安全的假设   命令式语言,大幅增加   内联的机会。

     

懒惰的评价也可能加快   程序,甚至渐近,而   它最多可能会减慢速度   常数因素(然而,它可能   使用时引入内存泄漏   不适当)。