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