Blog Details

SML和OCaml有什么区别?

有很多不同之处,有些是技术上的,有些是社会政治上的。我尝试先列出更重要的差异。

SML是一种带有定义和标准的语言。它是稳定的(事实上已经冻结了,因此无法演进)。Objective Caml是由INRIA的一个小团队控制的实现。它继续发展。(在我看来,演进得很好)

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

Objective Caml有许多附加功能,其中最突出的可能是对象和多态变体。

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

有相当多的语法差异。

库和标准函数截然不同。Caml库非常命令式,而SML标准基础库更加函数式。例如,在SML中,函数组合是一个顶层原语;它不是Caml库的一部分。Caml字符串库不提供折叠函数(至少在3.08版本中没有)。许多Caml List函数的实现对于非常长的列表是不安全的,它们会造成堆栈溢出。

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

Caml有一个更加合理的模块类型和实现之间关系(称为模块类型或签名)和(具体的)实现(称为模块或结构),比SML更加明智。在SML中,几乎任何东西都可以使用,必须依赖程序员建立良好的约定。在Caml中,编译器确保了良好的约定被建立和强制执行。

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

在SML中,程序员可以控制中缀运算符的优先级和结合性。在Caml中,这些由运算符名称的第一个字符决定。这种限制限制了定义自己的中缀表示法的好处。

要获得更详细的分析和编辑意见,您还可以查看Adam Chlipala的比较页面。