如果我已经了解OCaml,我应该学习Haskell还是F#?

时间:2009-05-05 00:18:20

标签: haskell f# ocaml language-comparisons

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

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

  • 长寿

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

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

    • 我喜欢我的语言一致。

请通过逻辑论证和文章引用来支持您的观点。谢谢。

8 个答案:

答案 0 :(得分:66)

  

长寿

  • Haskell 事实上是功能编程研究的主要语言。 Haskell 98将以稳定的形式存在多年,而Haskell可能持续10到30年 - 尽管语言将继续发展。社区对Haskell进行了大量投资,即使主要的GHC开发人员明天被一辆公共汽车撞到(着名的“剑桥巴士错误”问题),也有很多其他人可以加入这个行列。还有其他不太复杂的编译器。

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

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

  

实用性

     
    

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

  

这取决于你在搜索什么。当您的键是字符串时,ternary search trees通常比哈希表更快。当你的键是整数时,Okasaki和Gill的binary Patricia trees与散列竞争。如果你真的想,你可以使用IO monad在Haskell中构建一个哈希表,但是很少需要。

我认为懒惰评估总会有性能损失。但“实用”与“尽可能快”并不相同。以下是关于性能的:

  • 最容易预测Caml计划的时间和空间行为。

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

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

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

  

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

要了解Haskell中可能的范围,请查看xmonad窗口管理器和vast array ofpackages hackage.haskell.org

  

除非好处很大,否则我不喜欢被绑在庞大的.NET框架上。

我无法发表评论:

  

精心设计

     
    

我喜欢我的语言一致。

  

评估一致性的一些要点:

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

  • Haskell和OCaml都有关于运算符重载的非常一致的故事。 Haskell拥有一个可以扩展自己的一致且强大的机制。 OCaml没有任何超载。

  • OCaml拥有最简单的类型系统,特别是如果你不编写对象和仿函数(许多Caml程序员都没有这样做,尽管如果你写ML的话我不会写编写仿函数)。 Haskell的类型系统雄心勃勃且功能强大,但它不断得到改进,这意味着历史可能存在一些不一致性。 F#基本上使用.NET类型系统,加上类似ML的Hindley-Milner多态性(参见问题"What is Hindley-Milner"。)

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

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

答案 1 :(得分:24)

答案 2 :(得分:20)

这不是您的标准之一,但您是否考虑过工作可用性? Haskell目前确实列出了144个职位,Ocaml list 12和C#list 26,000。这些数字并不完美,但我敢打赌,一旦F#出货,不久之后它就会超过Haskell和Ocaml的工作列表数量。

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

答案 3 :(得分:13)

  

长寿

没有人可以预测未来,但

  • OCaml和Haskell多年来一直表现良好,这预示着他们的未来。
  • 当F#与VS2010一起发货时,MS将有法律义务支持它至少5年
  

实用性

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

库:轻松访问.Net Framework是F#的一大优势。如果你愿意的话,你可以把它视为“与这个笨重的东西联系在一起”,但不要忘记“你可以访问一个庞大的庞大的库,通常是非常有用的东西”。与.Net的“连接”是F#的一大卖点。 F#更年轻,因此第三方库更少,但已经例如{。3}},FsCheckFParsec以及其他一些内容,以及.Net上的“框中”库。

工具:我没有足够的个人经验来比较,但我认为与F#的VS集成优于今天你会发现的OCaml / Haskell(并且F#将在下一步继续改进年)。

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

  

精心设计

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

  

总体

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

答案 4 :(得分:6)

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

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

F#更年轻了,谁可以预测微软将决定采取哪些措施?您对此的感受更多取决于您对Microsoft的看法,而不是任何人可以告诉您的编程语言。

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

Haskell为您提供了所有这些(除了对象之外),但也或多或少地迫使您重新思考您认为对编程有用的所有内容。这可能是一件非常好的事情,如果你想要学习一些新的东西,但它可能比你想要的更多。我说这是一个只有在成为一个高效,快乐的Haskell程序员的道路上的人。

OCaml和Haskell都被用来编写许多不同类型的程序,而不仅仅是编译器和AI或其他任何程序。谷歌是你的朋友。

最后一点说明:OCaml为您提供了散列表,但如果您真的想要接受函数式编程,那么在代码中使用它是不明智的。持久树(如Data.Map)对于Haskell来说确实是正确的解决方案,并且有很多不错的属性,这是你拿起Haskell时要学习的很酷的事情之一。

答案 5 :(得分:3)

F#和OCaml在语法上非常相似,但很明显,F#在.NET中更好。

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

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

还有其他一些函数式语言,比如你可以看到的Erlang,但基本上,如果你在一种FP语言中很强大,那么你应该能够很快地选择另一种语言,所以,选择一个你喜欢的语言并尝试在其中开发有趣且具有挑战性的应用程序。

最终,语言编写者会找到一种让OO语言与多核兼容的方法,而FP可能会再次落在路边,但是,这似乎不会很快发生。

答案 6 :(得分:1)

这与OP关于是否学习F#的问题没有直接关系,而是与金融业中现实世界OCaml使用的一个例子: http://ocaml.janestreet.com/?q=node/61

非常有趣的谈话。

答案 7 :(得分:1)

就长寿而言,判断语言的流行程度非常困难,但只是在这里进行快速检查,这些是用适当的(功能)语言标记的问题数量: -

2672 Scala, 1936年哈斯克尔, 1674 F#, 1126 Clojure,  709计划,  332 OCaml

我想说这是一个很好的迹象,表明人们目前正在积极学习哪些语言,因此可能很好地表明未来几年哪些语言可能会受欢迎。