当前位置:  开发笔记 > 程序员 > 正文

SML和OCaml有什么区别?

如何解决《SML和OCaml有什么区别?》经验,为你挑选了2个好方法。

是什么让两个ML方言分开?



1> Norman Ramse..:

存在许多差异,一些是技术性的,一些是社会政治的.我试图先把更重要的差异放在一边.

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的比较页面.


您忘记了相等(OCaml中的不受限制和不安全与SML中的安全但受限制的相等类型),非泛化类型变量(OCaml中的'_a),printf,将文件名解释为OCaml中的模块名称,在OCaml的stdlib中更加令人讨厌.当你第二次写下别的东西(实现?)时你写了两次接口.
你做了重要的观察:"Caml库是非常必要的".这似乎贯穿了整个哲学,直到多核硬件上的并行实现似乎很难实现.相反,存在至少两个并行SML:Mlton和Poly/ML.
关于你的第三点,记录名称在OCaml中不再需要唯一性.

2> bk1e..:

有关Norman Ramsey提到的语法差异的详细信息,请参阅以下几个网页:

比较Objective Caml和Standard ML:对差异有很好的解释,"实用"与"纯"的图标也很有趣

标准ML和物镜Caml,并排

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有