Answers:
有很多差异,有些是技术上的,有些是社会政治上的。我试图先将更重要的差异放在首位。
SML是一种具有定义和标准的语言。它是稳定的(实际上已经冻结了,因此无法进化)。Objective Caml是由INRIA的一个小组控制的实现。它继续发展。(IMO的发展得到了很好的管理。)
SML有许多实现。骆驼只有一个。
Objective Caml具有许多其他功能,其中最突出的可能是对象和多态变体。
两种语言的记录类型模型截然不同。简而言之,在Caml中,记录字段的名称必须唯一,而在SML中,同一作用域中的两个不同记录类型可能具有相同的字段名称。这个怪癖可能会使从SML到Caml的移植变得有些棘手。
在语法上有很多差异。
库和标准函数有很大的不同。Caml库非常重要,而SML标准基础库则更具功能性。例如,功能组合是SML中的顶级原语;它不是Caml库的一部分。Caml字符串库不提供折叠功能(至少从3.08版开始不提供)。List
对于很长的列表,许多Caml 函数的实现都是不安全的。他们炸毁了筹码。
类型系统略有不同:在Caml中,e : ty
如果类型与的类型ty
统一,则在表达式上接受类型注释e
。在SML,e : ty
被接受仅当类型ty
是一个实例的类型e
。这种区别使Caml中的注释在实践中几乎没有用处,因为不可能使用类型注释来坚持表达式是多态的。
与SML相比,Caml在接口(称为模块类型或签名)和(具体)实现(称为模块或结构)之间具有更为健全和合理的关系。在SML中,几乎任何事情都会发生,您必须依靠程序员建立良好的约定。在Caml中,良好的约定是由编译器建立和执行的。
在SML中,算术运算符被重载以应用于浮点数据和整数数据。在Caml中,操作员不会超载;浮点运算符带有一个额外的点。
在SML中,程序员可以控制中缀运算符的优先级和关联性。在Caml中,这些由操作员名称的第一个字符确定。此限制限制了能够定义自己的中缀表示法的好处。
有关编辑评论的更详细分析,您还可以查看Adam Chlipala的比较页面。
有关Norman Ramsey提到的语法差异的详细信息,请参见以下两个网页: