103

是什么让这两种 ML 方言区分开来?

4

2 回答 2

161

有很多差异,有些是技术上的,有些是社会政治上的。我试图把更重要的区别放在首位。

  • SML 是一种具有定义和标准的语言。它是稳定的(实际上已被冻结,因此无法进化)。Objective Caml 是由 INRIA 的一个小组控制的实现。它继续发展。(IMO 进化管理得很好。)

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

  • Objective Caml 有许多额外的特性,其中最突出的可能是对象和多态变体。

  • 这两种语言具有截然不同的记录类型模型。简而言之,在Caml中,记录字段的名称必须是唯一的,而在SML中,同一范围内的两种不同的记录类型可能具有相同的字段名称。这个怪癖会使从 SML 移植到 Caml 有点棘手。

  • 有很多语法差异。

  • 库和标准函数有很大的不同。Caml 库非常必要,而 SML 标准基础库功能更强大。例如,函数组合是 SML 中的顶级原语;它不是 Caml 库的一部分。Caml 字符串库不提供折叠功能(至少从 3.08 版开始不提供)。许多 CamlList函数的实现对于很长的列表是不安全的;他们炸毁了堆栈。

  • 类型系统略有不同:在 Caml 中,如果类型与 的类型一致,e : ty则接受ty 表达式e上的类型注释。在 SML 中,e : ty仅当类型ty是 的类型的实例时才e被接受。这种区别使 Caml 中的注释在实践中的用处大大降低,因为不可能使用类型注释来坚持表达式是多态的。

  • 与 SML 相比,Caml 在接口(称为模块类型签名)和(具体)实现(称为模块结构)之间具有更加理智和合理的关系。在 SML 中,几乎任何事情都会发生,您必须依靠程序员来建立良好的约定。在 Caml 中,良好的约定由编译器建立和执行。

  • 在 SML 中,算术运算符被重载以适用于浮点和整数数据。在 Caml 中,运算符没有重载;浮点运算符用一个额外的点表示。

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

如需更详细的分析以及编辑评论,您还可以查看Adam Chlipala 的比较页面

于 2009-03-31T02:00:24.217 回答
-2

OCaml 添加了面向对象的特性并且有一些小的语法差异。

于 2009-03-31T01:35:33.417 回答