Interface OCaml接口与签名?

Interface OCaml接口与签名?,interface,module,structure,ocaml,signature,Interface,Module,Structure,Ocaml,Signature,我对OCaml中的接口和签名有点困惑。 据我所知,接口(即.mli文件)控制着其他程序可以使用/调用哪些值。签名文件看起来完全一样,只是命名了它,这样您就可以创建不同的接口实现。 例如,如果我想创建一个与Java中的集合类似的模块: 我想要这样的: set.mli文件: type 'a set val is_empty : 'a set -> bool val .... etc. 签名文件(setType.ml) 然后一个实现就是另一个.ml文件,比如SpecialSet.m

我对OCaml中的接口和签名有点困惑。 据我所知,接口(即.mli文件)控制着其他程序可以使用/调用哪些值。签名文件看起来完全一样,只是命名了它,这样您就可以创建不同的接口实现。 例如,如果我想创建一个与Java中的集合类似的模块:

我想要这样的:

set.mli文件:

type 'a set
  val is_empty : 'a set -> bool
  val ....
  etc.
签名文件(setType.ml)

然后一个实现就是另一个.ml文件,比如SpecialSet.ml,它包含一个定义所有值及其作用的结构

module SpecialSet : Set
struct
 ...
我有点搞不清楚“签名”到底是做什么的,它有什么用途。它不是像一种界面吗?为什么同时需要.mli和.ml?我看到的行的唯一区别是它命名了模块


我是否误解了这一点,或者这里发生了其他事情?

OCaml的模块系统被绑定到单独的编译中(成对的
.ml
.mli
文件)。因此,每个
.ml
文件都隐式定义了一个模块,每个
.mli
文件都定义了一个签名,如果存在相应的
.ml
文件,则该签名将应用于该模块

.ml
.mli
文件中,使用显式语法根据自己的喜好操作模块和接口非常有用。这允许类型替换,如在
S中使用类型t=M.t
。 不仅仅是它提供了定义函子的可能性,由一个或多个模块参数化的模块:
modulef(X:S)=struct。。。结束
。如果定义模块或签名的唯一方法是文件,那么所有这些都是不可能的


我不确定这是如何回答你的问题的,但我认为你的问题的答案可能是“是的,它和你想的一样简单,在你的例子中,
.mli
文件和文件内显式签名的系统是多余的。除了这些简单的事情外,在文件中操纵模块和签名还允许使用更复杂的技巧。”

这个问题很老了,但可能对某些人有用:

名为A.ml的文件在程序中显示为模块A。。。 模块a.ml的接口可以写入名为a.mli的文件中

这是来自巴黎迪德罗大学的OCaml MOOC

module SpecialSet : Set
struct
 ...