24

我想知道我是否应该继续学习 OCaml 或切换到 F# 或 Haskell。

以下是我最感兴趣的标准:

  • 长寿

    • 哪种语言会持续更长时间?我不想学习可能在几年内被用户和开发人员抛弃的东西。
    • 从长远来看,Inria、微软、格拉斯哥大学会继续支持各自的编译器吗?
  • 实用性

    • 这样的文章让我害怕使用 Haskell。哈希表是快速检索的最佳结构。那里的 Haskell 支持者建议使用二叉树 Data.Map。
    • 除非好处很大,否则我不喜欢与庞大的 .NET 框架联系在一起。
    • 我希望能够开发的不仅仅是解析器和数学程序。
  • 精心设计

    • 我喜欢我的语言保持一致。

请用合乎逻辑的论据和文章引用来支持你的观点。谢谢你。

4

8 回答 8

66

长寿

  • Haskell实际上是函数式编程研究的主要语言。Haskell 98 将以稳定的形式持续多年,而称为 Haskell 的东西可能会持续 10 到 30 年——尽管该语言将继续发展。社区对 Haskell 进行了重大投资,即使主要的 GHC 开发人员明天被公共汽车撞到(著名的“剑桥公共汽车错误”问题),也有很多其他人可以挺身而出。还有其他不太复杂的编译器。

  • Caml 由法国国家实验室 INRIA 的一个小组控制。他们也有很大的投入,其他的也有Caml的投入,而且代码是开源的,编译器也不太复杂,所以也会维护很久。我预测 Caml 将比 Haskell 稳定得多,因为 INRIA 的人们似乎不再将其用作探索新语言想法的工具(或者至少他们这样做的速度比过去要低)。

  • 谁知道公司会做什么?如果 F# 成功,微软可以支持它 20 年。如果不成功,他们可能会在 2012 年拔掉插件。我猜不出来,也不会尝试。

实用性

哈希表是快速检索的最佳结构。那里的 Haskell 支持者建议使用二叉树 Data.Map。

这取决于您要搜索的内容。当您的键是字符串时,三元搜索树通常比哈希表更快。当您的键是整数时,Okasaki 和 Gill 的二叉 Patricia 树可以与散列竞争。如果你真的想要,你可以使用 IO monad 在 Haskell 中构建一个哈希表,但很少需要这样做。

我认为惰性评估总会有性能损失。但“实用”不等于“尽可能快”。以下关于性能的说法是正确的:

  • 最容易预测 Caml 程序的时间和空间行为。

  • F# 在中间(谁真正知道 .NET 和 JIT 会做什么?)。

  • 最难预测 Haskell 程序的时间和空间行为。

  • Haskell 拥有最好的分析工具,从长远来看,这是产生最佳性能的原因。

我希望能够开发的不仅仅是解析器和数学程序。

要了解 Haskell 的功能范围,请查看xmonad窗口管理器hackage.haskell.org.

除非好处很大,否则我不喜欢与庞大的 .NET 框架联系在一起。

我无法评论:

精心设计

我喜欢我的语言保持一致。

评估一致性的几点:

  • Haskell 的具体语法设计得非常好;Haskell 委员会的出色工作给我留下了深刻的印象。OCaml 语法还可以,但相比之下会受到影响。F# 从 Caml 核心语法开始,有很多相似之处。

  • Haskell 和 OCaml 都有关于运算符重载的非常一致的故事。Haskell 具有一致且强大的机制,您可以自行扩展。OCaml 没有任何类型的重载。

  • OCaml 具有最简单的类型系统,特别是如果您不编写对象和函子(许多 Caml 程序员不这样做,尽管在编写 ML 时不编写函子对我来说似乎很疯狂)。Haskell 的类型系统雄心勃勃且功能强大,但它在不断改进,这意味着由于历史原因存在一些不一致之处。F# 本质上使用 .NET 类型系统,以及类似 ML 的 Hindley-Milner 多态性(请参阅问题“什么是 Hindley-Milner”。)

  • OCaml 在它认为变体应该是静态类型还是动态类型方面并不太一致,因此它同时提供了(“代数数据类型”和“多态变体”)。由此产生的语言具有很强的表达能力,这对专家来说非常有用,但对于业余爱好者来说,使用哪种结构并不总是显而易见的。

  • OCaml 的评估顺序是官方未定义的,这在具有副作用的语言中是一个糟糕的设计选择。更糟糕的是,实现是不一致的:字节编码的虚拟机使用一种顺序,而本机代码编译器使用另一种。

于 2009-05-05T04:27:06.427 回答
24

如果你知道 OCaml,你应该学习 F# 还是 Haskell?

我相信答案肯定是肯定的,理想情况下你应该学习所有这三种语言,因为每种语言都有一些东西可以提供,但 F# 是唯一一种前途光明的语言,所以,如果你只能学习一种语言,请通过阅读我的Visual F# 来学习 F# 2010 年获得技术计算书籍或订阅我们的 F#.NET 期刊

长寿

微软在四月份将 F# 作为 Visual Studio 2010 的一部分发布时承诺支持它。因此,F# 至少在几年内保证了美好的未来。凭借强大的实用功能组合,如高性能本机代码 REPL、.NET 4 内置的高级并行结构和生产质量的 IDE 模式,F#远远领先于任何其他函数式编程现在就现实世界的适用性而言的语言。坦率地说,在不久的将来,甚至没有人在研究任何可能与 F# 竞争的东西。我自己的开源HLVM项目正在尝试这样做,但还远远没有准备好。

相比之下,OCaml 和 Haskell 的开发方向都非常低效。这已经扼杀了 OCaml 好几年了,我希望 Haskell 在接下来的几年里也会效仿。大多数以前的专业 OCaml 和 Haskell 程序员已经转向 F#(例如 Credit Suisse、Flying Frog Consultancy),而其余的大多数人无疑会在不久的将来迁移到更实用的替代方案,例如 Clojure 和 Scala。

具体来说,OCaml 的 QPL 许可证可以防止其他任何人修复其越来越多的基本设计缺陷(32 位机器上的 16Mb 字符串和数组限制、没有共享内存并行性、没有值类型、通过类型擦除的参数多态性、解释性 REPL、繁琐的 FFI等),因为他们必须仅以补丁的形式分发衍生作品到原始作品,并且 Debian 软件包维护者拒绝承认上游的替代品。添加到该语言中的新功能,例如 OCaml 3.12 中的一流模块,远没有多核功能那么有价值。

一些项目开始试图拯救 OCaml,但事实证明它们太少太晚了。并行 GC几乎没用,David Teller 退出了包含电池的项目(尽管它已被捡起并以缩减的形式发布)。因此,OCaml 已经从2007 年最流行的函数式语言变成了今天的严重衰退,caml-list 的流量自 2007 年以来下降了 50% 以上

Haskell 的工业用户比 OCaml 少,虽然它确实支持多核,但它仍在朝着一个非常低效的方向发展。Haskell 几乎完全由剑桥(英国)微软研究院的两个人开发。尽管纯粹的函数式编程在设计上不利于性能,但他们仍在继续尝试开发针对多核的并行 Haskell 解决方案,因为它所招致的大量不必要的复制撞到了内存墙并破坏了在一个可扩展并行性上的任何希望多核。

业界唯一的 Haskell 主要用户是Galois,拥有大约 30 名全职 Haskell 程序员。我怀疑他们会让 Haskell 彻底死掉,但这并不意味着他们会把它发展成一种更普遍有用的语言。

实用性

我写了你引用的关于哈希表的文章。它们是一个很好的数据结构。其他人提到了诸如三叉树和帕特里夏树之类的纯功能替代方案,但在实践中这些通常比哈希表慢约 10 倍。原因很简单,缓存未命中在当今的性能问题中占主导地位,并且树会导致额外的 O(log n) 指针间接寻址。

我个人偏爱可选的惰性和可选的纯度,因为两者在现实世界中通常会适得其反(例如,惰性使性能和内存消耗变得不可预测,而纯度严重降低了平均情况下的性能,并使互操作性成为一场噩梦)。我是仅有的通过我自己的公司完全靠函数式编程谋生的人之一。可以说,如果我认为 Haskell 是可行的,我会在几年前进行多元化投资,但我一直选择不这样做,因为我不相信它在商业上是可行的。

你说“我不喜欢被捆绑到一个庞大的 .NET 框架,除非好处很大”。好处是巨大的。您将获得一个生产质量的 IDE,一个生产质量的 JIT 编译器,它执行非常有效的优化,如类型专用泛型,生产质量的库,适用于从 GUI 编程(参见32 行 F# 中的 Game of Life)到数字运算的所有内容。但 .NET 的真正好处,至少对我而言,是你可以出售你用 F# 编写的库并赚很多钱。没有人成功地向 OCaml 和 Haskell 程序员销售库(我是少数尝试过的人之一),但 F# 库已经大量销售。因此,如果您想通过编写软件谋生,那么庞大的 .NET 框架非常值得。

精心设计

这些语言都经过精心设计,但用途不同。OCaml 是专门为编写定理证明器而设计的,而 Haskell 是专门为研究 Haskell 而设计的。F# 旨在解决 OCaml 和 Haskell 的所有最严重的实际问题,例如互操作性差、缺乏并发垃圾收集以及缺乏像 WPF 这样的成熟现代库,以便为广大受众带来高效的现代语言。

于 2009-05-06T00:59:35.747 回答
20

这不是您的标准之一,但您是否考虑过工作机会?Haskell 目前确实列出了 144 个工作,Ocaml 列表 12 和 C# 列表 26,000。这些数字并不完美,但我敢打赌,一旦 F# 发布,它的工作列表数量很快就会超过 Haskell 和 Ocaml。

到目前为止,Visual Studios 中包含的每种编程语言都有数以千计的工作列表。在我看来,如果你想要最好的机会使用函数式编程语言作为你的日常工作,那么 F# 很快就会出现。

于 2009-05-05T23:37:39.547 回答
13

长寿

没有人能预知未来,但

  • OCaml 和 Haskell 多年来一直很好地生存,这对他们的未来来说是个好兆头
  • 当 F# 附带 VS2010 时,MS 将有法律义务支持它至少 5 年

实用性

Perf:我对 Haskell 没有足够的第一手经验,但是基于二手和三手信息,我认为 OCaml 或 F# 更实用,从某种意义上说我认为你不太可能能够在 Haskell 中获得与在 F# 的 OCaml 中相同的运行时性能。

库:轻松访问 .Net Framework 是 F# 的一大优势。如果您愿意,您可以将其视为“与这个庞大的东西捆绑在一起”,但不要忘记“您可以访问一个庞大的、包含通常非常有用的东西的庞大库”。与 .Net 的“连接性”是 F# 的一大卖点。F# 更年轻,因此第三方库较少,但除了 .Net 上的“盒中”库之外,已经有FsCheckFParsecFake和一堆其他库。

工具:我没有足够的个人经验来比较,但我认为 VS 与 F# 的集成优于你今天为 OCaml/Haskell 找到的任何东西(并且 F# 将在明年继续改进)。

更改:F# 在接近 VS2010 中的第一个受支持版本时仍在更改,因此在不久的将来您可能不得不忍受对语言/库的一些重大更改。

精心设计

Haskell 绝对是美丽和一致的。我不太了解 OCaml,但我的直觉是它同样具有吸引力。我认为 F# 比其中任何一个都“更大”,这意味着更多尘土飞扬的角落和不一致(主要是由于调解 FP 和 .Net 之间的阻抗不匹配),但总体而言 F# 对我来说仍然感觉“干净”,而且确实存在的不一致至少是有充分理由/有意的。

总体

在我看来,你会很好地了解这三种语言中的任何一种。如果你知道一个你想要使用它的大型长期项目,一个可能会脱颖而出,但我认为许多技能将是可以转移的(在 F# 和 OCaml 之间比在 Haskell 之间更容易转移,但在任何技能中也更容易转移)这三个比使用Java)。

于 2009-05-05T02:30:40.200 回答
6

这个问题没有简单的答案,但这里有一些事情需要考虑:

Haskell 和 OCaml 都是具有强大实现的成熟语言。实际上,Haskell 有多种很好的实现,但我认为这对你的目的来说并不是一个重点。

F# 更年轻,谁能预测微软将决定把它带到哪里?你对此的感受更多地取决于你对微软的感受,而不是任何人能告诉你的关于编程语言的任何事情。

OCaml(或一般的 ML)是一种很好的实用语言选择,它支持做很酷的功能性东西,而不会强迫您以可能不舒服的方式工作。您可以充分利用代数数据类型、模式匹配、类型推断以及其他所有人最喜欢的东西。哦,还有对象。

Haskell 为您提供了所有这些(几乎除了对象),但也或多或少地迫使您重新思考您认为自己对编程了解的一切。如果您想学习新的东西,这可能是一件非常好的事情,但它可能比您想要的更多。我这样说是作为一个在成为一名高效、快乐的 Haskell 程序员的道路上可能只走了一半的人。

OCaml 和 Haskell 都被用于编写许多不同类型的程序,而不仅仅是编译器和 AI 等。谷歌是你的朋友。

最后一点:OCaml 为您提供哈希表,但如果您真的想接受函数式编程,在代码中使用它几乎不明智。持久化树(如 Data.Map)确实是 Haskell 的正确解决方案,并且具有许多不错的属性,这是您学习 Haskell 时要了解的很酷的事情之一。

于 2009-05-05T01:00:41.587 回答
3

F# 和 OCaml 在语法上非常相似,但显然 F# 更适合 .NET。

您学习或使用哪一个应该取决于您的目标平台。

在 VS2010 中将包含 F#,由于它编译为 .NET 字节码,因此可以在支持您使用的 .NET 版本的 Windows 操作系统上使用。这会给你一个很大的区域,但是有一些限制,目前 F# 是 OCaml 没有的,因为 F# 似乎没有利用机器上的所有处理器,但是,这可能是由于 F# 仍在开发中,这可能是一个不那么重要的功能。

还有其他函数式语言,例如 Erlang,你可以看看,但是,基本上,如果你精通一种 FP 语言,那么你应该能够相当快地学会另一种语言,所以,只需选择一种你喜欢的并尝试在其中开发有趣且具有挑战性的应用程序。

最终,语言编写者会找到一种方法让 OO 语言在多核上很好地工作,而 FP 可能会再次被淘汰,但是,这似乎不会很快发生。

于 2009-05-05T00:25:52.200 回答
1

这与 OP 关于是否学习 F# 的问题没有直接关系,而是在金融领域的真实世界 OCaml 使用示例:http: //ocaml.janestreet.com/ ?q=node/61

很有趣的谈话。

于 2010-08-13T08:10:55.790 回答
1

就寿命而言,很难判断语言的受欢迎程度,但只是在这里快速检查一下,这些是用适当(功能)语言标记的问题数量:-

2672 Scala,1936 Haskell,1674 F#,1126 Clojure,709 Scheme,332 OCaml

我想说这很好地表明了人们目前正在积极学习哪些语言,因此可能很好地表明了哪些语言在未来几年可能会流行。

于 2010-12-16T13:44:31.750 回答