如果你知道 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 这样的成熟现代库,以便为广大受众带来高效的现代语言。