SML和OCaml有什么区别?

两个ML方言的区别是什么?

有很多的差异,一些技术的,一些社会政治的。 我试着先把更重要的差异放在一起。

  • SML是一种有定义和标准的语言。 它是稳定的(实际上已经被冻结,所以它不能进化)。 Objective Caml是由INRIA的一个小组控制的一个实现。 它继续发展。 (海事组织的演变pipe理得很好。)

  • SML有许多实现; Caml只有一个。

  • 目标Caml有一些额外的function,其中最突出的可能是对象和多态变体。

  • 这两种语言的loggingtypes有很大的不同。 简而言之,在Caml中,logging字段的名称必须是唯一的,在SML中,同一作用域中的两个不同loggingtypes可能具有相同的字段名称。 这个怪癖可以使从SML到Caml的移植有点棘手。

  • 有很多句法上的差异。

  • 这些库和标准函数有很大的不同。 Caml图书馆是非常必要的,而SML标准基础库更实用。 例如,函数合成是SML中的顶级基元; 它不是Caml图书馆的一部分。 Camlstring库不提供折叠function(至less不是版本3.08)。 很多Caml List函数的实现对于很长的列表是不安全的; 他们吹了堆栈。

  • types系统是微妙的不同的:在Caml中,如果typestye的types相结合 ,则在expression式e : ty上的types注释被接受。 在SML中,只有在typestyetypes的实例时才接受e : ty 。 这种区别使得Caml中的注释在实践中更加有用,因为不可能使用types注释来坚持expression式是多态的。

  • 与SML相比,Caml在界面(称为模块types签名 )和(具体)实现(称为模块结构 )之间有着更为理智和明智的关系。 在SML中,几乎所有的东西都要依靠程序员来build立良好的约定。 在Caml,良好的约定是由编译器build立和执行的。

  • 在SML中,算术运算符被重载以应用于浮点数据和整数数据。 在Caml中,运算符不会超载; 浮点运算符用额外的点表示。

  • 在SML中,程序员可以控制中缀运算符的优先级和相关性。 在Caml中,这些由操作员姓名的第一个字符决定。 这个限制限制了能够定义自己的中缀表示法的好处。

有关编辑评论的更详细分析,您也可以查看Adam Chlipala的比较页面 。

有关Norman Ramsey提到的语法差异的详细信息,这里有几个网页:

  • 比较目标Caml和标准ML :对差异有很好的解释,“实用”和“纯”图标也很有趣
  • 标准ML和目标Caml,并排

OCaml增加了面向对象的function,并有一些小的语法差异。