sor*_*rry 12 ocaml module structure interface signature
我对OCaml中的接口与签名有点困惑.根据我的阅读,接口(.mli文件)管理其他程序可以使用/调用的值.签名文件看起来完全相同,除了它们命名,因此您可以创建不同的接口实现.例如,如果我想创建一个类似于Java中的集合的模块:
我有这样的事情:
set.mli文件:
type 'a set
val is_empty : 'a set -> bool
val ....
etc.
Run Code Online (Sandbox Code Playgroud)
签名文件(setType.ml)
module type Set = sig
type 'a set
val is_empty : 'a set -> bool
val ...
etc.
end
Run Code Online (Sandbox Code Playgroud)
然后一个实现将是另一个.ml文件,例如SpecialSet.ml,它包含一个定义所有值及其作用的结构.
module SpecialSet : Set
struct
...
Run Code Online (Sandbox Code Playgroud)
关于"签名"究竟是什么以及它的用途是什么,我有点困惑.它不是一种界面吗?为什么需要.mli和.ml?我看到的行的唯一区别是它命名模块.
我误解了这个,还是还有其他事情发生在这里?
Pas*_*uoq 12
OCaml的模块系统与单独的编译(成对.ml和.mli文件)相关联.因此,每个.ml文件隐式定义一个模块,每个.mli文件定义一个签名,如果有相应的.ml文件,则该签名应用于该模块.
有一个明确的语法来操作模块和接口顺心内是有用的.ml或.mli文件.这允许类型替换,如S with type t = M.t.尤其是定义仿函数,由一个或多个模块参数化的模块的可能性:module F (X : S) = struct ... end.如果将模块或签名定义为文件的唯一方法,那么所有这些都是不可能的.
我不确定如何回答你的问题,但我认为你的问题的答案可能是"是的,它就像你想象的那么简单,.mli文件中的文件和显式签名系统在你的例子中是多余的.操作模块除了这些简单的东西之外,文件中的签名还允许更复杂的技巧".