我的问题是标准ML的模块系统和OCaml模块系统之间是否有任何区别? OCaml是否具有SML拥有的所有functors、ascriptions等支持?
在功能和语义上,SML和OCaml之间存在一些差异。
SML支持的功能但OCaml不支持:
let
OCaml 4支持的功能但SML不支持:
sig with module A = M
)module type of
然而,一些SML实现提供了这些扩展功能,例如:高阶functors(SML/NJ、Moscow ML、Alice ML)、本地和一等公民模块(Moscow ML、Alice ML)、模块共享(SML/NJ、Alice ML)、嵌套签名(Moscow ML、Alice ML)和递归模块(Moscow ML)。
就语义而言,最大的区别在于类型等价的处理方式,特别是与functor相关的处理方式:
在SML中,functor是生成的,这意味着将相同的functor应用于相同的参数两次总会产生新的类型。另一个显著的区别是,OCaml的模块类型系统是不可判定的(即,类型检查可能不会终止),这是由于允许抽象签名,而SML不允许。
SML 中还有 abstype 工具,它类似于 datatype 工具,但它隐藏了 datatype 的结构。OCaml 依靠模块抽象来进行必要的隐藏。请注意,this site 没有提到 SML 中的此工具。
或
F(type t; val x:t)`,并且对于函数的应用也是类似的。 - Andreas Rossberg