OCaml接口与签名?

时间:2011-08-29 02:22:52

标签: interface module structure ocaml signature

我对OCaml中的接口与签名有点困惑。 根据我的阅读,接口(.mli文件)管理其他程序可以使用/调用的值。签名文件看起来完全相同,只是它们命名它,以便您可以创建接口的不同实现。 例如,如果我想创建一个类似于Java中的集合的模块:

我会有这样的事情:

set.mli文件:

type 'a set
  val is_empty : 'a set -> bool
  val ....
  etc.

签名文件(setType.ml)

module type Set = sig
  type 'a set

  val is_empty : 'a set -> bool 
  val ...
  etc.
end

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

module SpecialSet : Set
struct
 ...

我对“签名”到底是做什么以及它的用途有点困惑。它不是一种界面吗?为什么需要.mli和.ml?我看到的行的唯一区别是它命名模块。

我误解了这个,还是还有其他事情发生在这里?

2 个答案:

答案 0 :(得分:12)

OCaml的模块系统与单独的编译(.ml.mli文件对)联系在一起。因此,每个.ml文件隐式定义一个模块,每个.mli文件定义一个签名,如果有相应的.ml文件,则该签名应用于该模块。

.ml.mli文件中使用明确的语法来操作模块和接口非常有用。这允许类型替换,如S with type t = M.t中所示。 尤其是定义由一个或多个模块参数化的仿函数模块的可能性:module F (X : S) = struct ... end。如果定义模块或签名的唯一方法是作为文件,那么所有这些都是不可能的。

我不确定如何回答你的问题,但我认为你的问题的答案可能是“是的,它就像你想象的那样简单,以及在文件中包含.mli个文件和显式签名的系统 在您的示例中是多余的。在文件中操作模块和签名除了这些简单的事情之外还允许更复杂的技巧“。

答案 1 :(得分:1)

这个问题很陈旧,但这可能对某人有用:

"A file named a.ml appears as a module A in the program... The interface of the module a.ml can be written in file named a.mli"

slide link

这是来自UniversitéParisDiderot的OCaml MOOC。