如果你知道 OCaml,你应该学习 F# 还是 Haskell?
我相信答案肯定是肯定的,理想情况下,您应该学习所有三种语言,因为每种语言都有所提供的东西,但 F# 是唯一具有重要未来的语言,因此,如果您只能学习一种语言,请通过阅读来学习 F#我的Visual F# 2010 for Technical Computing book 或订阅我们的The F#.NET Journal。
长寿
微软在 4 月将 F# 作为 Visual Studio 2010 的一部分发布时承诺支持它。因此,F# 至少在几年内保证了美好的未来。 F# 结合了实际重要的功能,如高性能本机代码 REPL、.NET 4 内置的高级并行结构和生产质量的 IDE 模式,long现在在现实世界的适用性方面领先于任何其他函数式编程语言。坦率地说,在不久的将来,甚至没有人在研究任何可能与 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 而启动了一些项目,但事实证明它们为时已晚。 parallel GC 几乎没用,David Teller 退出了 batteries included 项目(尽管它已被捡起并以缩减的形式发布)。因此,OCaml 已经从 the most popular functional language in 2007 变成了今天的严重衰退,caml-list traffic down over 50% since 2007。
Haskell 的工业用户比 OCaml 少,虽然它确实支持多核,但它仍在朝着一个非常低效的方向发展。 Haskell 几乎完全由剑桥(英国)微软研究院的两个人开发。尽管纯粹的函数式编程在设计上不利于性能,但他们仍在继续尝试开发针对多核的并行 Haskell 解决方案,因为它所招致的大量不必要的复制撞到了内存墙并破坏了在一个可扩展并行性上的任何希望多核。
业界唯一的 Haskell 主要用户是 Galois,拥有大约 30 名全职 Haskell 程序员。我怀疑他们会让 Haskell 彻底死掉,但这并不意味着他们会把它发展成一种更普遍有用的语言。
实用性
我写了你引用的关于哈希表的文章。它们是一个很好的数据结构。其他人提到了诸如三叉树和帕特里夏树之类的纯功能替代方案,但在实践中这些通常比哈希表慢约 10 倍。原因很简单,缓存未命中在当今的性能问题中占主导地位,并且树会导致额外的 O(log n) 指针间接寻址。
我个人偏爱可选的惰性和可选的纯度,因为两者在现实世界中通常会适得其反(例如,惰性会使性能和内存消耗变得不可预测,而纯度会严重降低平均情况下的性能并使互操作性成为一场噩梦)。我是仅有的通过我自己的公司完全靠函数式编程谋生的人之一。可以这么说,如果我认为 Haskell 是可行的,我会在几年前将其多元化,但我一直选择不这样做,因为我认为它在商业上不可行。
您说“我不喜欢被捆绑到庞大的 .NET 框架,除非好处很大”。好处是巨大的。您将获得一个生产质量的 IDE,一个生产质量的 JIT 编译器,它执行非常有效的优化,如类型专用泛型,生产质量的库,适用于从 GUI 编程(参见Game of Life in 32 lines of F#)到数字运算的所有内容。但 .NET 的真正好处,至少对我而言,是你可以出售你用 F# 编写的库并赚很多钱。没有人成功地向 OCaml 和 Haskell 程序员销售库(我是少数尝试过的人之一),但 F# 库已经大量销售。因此,如果您想通过编写软件谋生,那么庞大的 .NET 框架非常值得。
精心设计
这些语言都经过精心设计,但用途不同。 OCaml 是专门为编写定理证明器而设计的,而 Haskell 是专门为研究 Haskell 而设计的。 F# 旨在解决 OCaml 和 Haskell 的所有最严重的实际问题,例如互操作性差、缺乏并发垃圾收集以及缺乏 WPF 等成熟的现代库,以便为广大受众带来高效的现代语言。