是什么让两个ML方言分开?
存在许多差异,一些是技术性的,一些是社会政治的.我试图先把更重要的差异放在一边.
SML是一种定义和标准的语言.它是稳定的(实际上已被冻结,因此无法进化).目标Caml是由INRIA的一个小组控制的实现.它继续发展.(国际海事组织的演变管理得很好.)
SML有很多实现; Caml只有一个.
目标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的比较页面.
有关Norman Ramsey提到的语法差异的详细信息,请参阅以下几个网页:
比较Objective Caml和Standard ML:对差异有很好的解释,"实用"与"纯"的图标也很有趣
标准ML和物镜Caml,并排