我知道几种函数式语言--F#,Lisp及其方言,R等。但是,因为我从来没有使用它们(尽管我提到的三个都在我的“学习”列表中),我想知道各种功能语言的优点/缺点。在学习语言和所述语言的任何实际应用中是否有重要的优点/缺点?
答案 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#):
优点:
缺点:
我没有提到大多数静态类型函数语言常见的特征:类型推断,参数多态,高阶函数,algrebraic数据类型&模式匹配。
答案 4 :(得分:0)
我在大学里学过Haskell就像一个纯粹的功能性语言,我可以说它非常强大,但我也找不到实际用途。
然而,我发现了这个:Haskell in practice。检查一下,真是太棒了。
功能范式的特征有时是优点,有时是缺点,取决于情况/背景。 其中一些是:
来自维基百科:
效率问题
功能编程语言有 被认为效率低下 他们使用的CPU和内存比 命令式语言,如C和 帕斯卡。[26]但是,对于程序而言 执行密集的数字 计算,功能语言 如OCaml和Clean类似 速度为C.对 处理大型矩阵的程序 和多维数据库,数组 函数式语言(如J和K) 设计与速度优化 记住。
纯功能语言有 声誉比慢 命令式语言。 但是,数据的不变性可以在 很多情况下,导致执行 允许编译器的效率 做一些不安全的假设 命令式语言,大幅增加 内联的机会。
懒惰的评价也可能加快 程序,甚至渐近,而 它最多可能会减慢速度 常数因素(然而,它可能 使用时引入内存泄漏 不适当)。