两种ML方言分开了什么?
答案 0 :(得分:155)
存在许多差异,一些是技术性的,一些是社会政治的。我试图首先提出更重要的差异。
SML是一种定义和标准的语言。它是稳定的(实际上已被冻结,因此无法进化)。目标Caml是由INRIA的一个小组控制的实现。它继续发展。 (IMO进化得很好。)
SML有很多实现; Caml只有一个。
目标Caml有许多其他功能,其中最突出的可能是对象和多态变体。
这两种语言具有截然不同的记录类型模型。简而言之,在Caml中,记录字段的名称必须是唯一的,其中在SML中,同一范围内的两个不同记录类型可以具有共同的字段名称。这个怪癖可以使从SML移植到Caml有点棘手。
有很多句法差异。
库和标准函数截然不同。 Caml库非常重要,而SML标准库则功能更强大。例如,函数组合是SML中的顶级基元;它不是Caml库的一部分。 Caml字符串库不提供折叠功能(至少不是3.08版本)。许多Caml List
函数的实现对于很长的列表是不安全的;他们吹了堆栈。
类型系统略有不同:在Caml中,如果类型e : ty
统一,则接受表达式ty
上的类型注释{ {1}}。在SML中,仅当类型e
是e : ty
类型的实例时,才会接受ty
。这种区别使得Caml中的注释在实践中变得不那么有用,因为不可能使用类型注释来坚持表达式是多态的。
Caml在接口(称为模块类型或签名)和(具体)实现(称为模块<)之间具有更加理智和明智的关系/ em>或结构)而不是SML。在SML中,几乎任何事情都有,你必须依靠程序员来建立良好的约定。在Caml中,编译器建立并实施了良好的约定。
在SML中,算术运算符被重载以应用于浮点数和整数数据。在Caml中,运营商不会超载;浮点运算符标有额外的点。
在SML中,程序员可以控制中缀运算符的优先级和关联性。在Caml中,这些由运营商名称的第一个字符决定。此限制限制了能够定义自己的中缀表示法的好处。
有关编辑评论的更详细分析,您还可以查看Adam Chlipala's comparison page。
答案 1 :(得分:30)
关于Norman Ramsey提到的语法差异的详细信息,这里有几个网页:
答案 2 :(得分:-3)
OCaml添加了面向对象的功能,并且有一些小的语法差异。