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