OCaml 的模块,Sig 和ml, mli文件

mli文件,就像是java 的interface,但是并不完全一样。特别是当你用dune构建系统的时候,你可能甚至不需要注意到mli文件的存在。dune会帮你自动处理。

我曾经试过只写ml文件,不去管mli文件,一样能编译。

有时候如果你强行去探求问题的真相,可能会很痛苦:这样怎么可以?这不是乱来吗?所以人要学会跟自己和解,存在即合理。

OCaml它就是这样灵活,给了你很大自由。

另外。我们注意到我们如果定义了module type XXXX sig,这个称之为签名,我们一定要把它放到我们要使用的module同一个文件。

 

什么意思呢。就是如果你放到不同的文件,OCaml编译器甚至都找不到。。会报错。

所以sig 写在哪里,module实现就写在哪里。

举个例子,我们看我们的一个示例类库的ml文件和mli文件

netrc.ml文件

module type Netrc_type = 
sig
  val readAsString : unit -> string
  val readHelloWorld : unit -> string
  val hello : unit -> unit
end

module Netrc : Netrc_type = struct
  let  readAsString ()  = 
     let ch = open_in "/etc/resolv.conf" in
     let s = really_input_string ch (in_channel_length ch) in
     close_in ch;
     print_endline s;
     s

  let readHelloWorld ()  = "I am the hello world"
  let hello () = print_endline "Gear box from module"
end

netrc.mli文件

module type Netrc_type =
  sig
    val readAsString : unit -> string
    val readHelloWorld : unit -> string
    val hello : unit -> unit
  end
module Netrc : Netrc_type

我们通过ocamlc -i netrc.ml > netrc.mli 可以自动生成mli文件【相当于生成interface】

我们注意到module type sig 在ml文件里面出现了,然后生成的mli文件又出现了。。

看到没有,这就是我说的 module type 在哪里定义,module 就在哪里实现。

module Netrc它实现了Netrc_type sig中定义的方法。

 

我们在sig定义了三个方法,然后我们实现的时候,实现了3个方法。这两边就对上号了。

 

分类: 默认 标签: 发布于: 2022-06-28 16:54:51, 更新于: 2022-06-28 16:55:36