mli文件,就像是java 的interface,但是并不完全一样。特别是当你用dune构建系统的时候,你可能甚至不需要注意到mli文件的存在。dune会帮你自动处理。
我曾经试过只写ml文件,不去管mli文件,一样能编译。
有时候如果你强行去探求问题的真相,可能会很痛苦:这样怎么可以?这不是乱来吗?所以人要学会跟自己和解,存在即合理。
OCaml它就是这样灵活,给了你很大自由。
另外。我们注意到我们如果定义了module type XXXX sig,这个称之为签名,我们一定要把它放到我们要使用的module同一个文件。
什么意思呢。就是如果你放到不同的文件,OCaml编译器甚至都找不到。。会报错。
所以sig 写在哪里,module实现就写在哪里。
举个例子,我们看我们的一个示例类库的ml文件和mli文件
netrc.ml文件
netrc.mli文件
我们通过ocamlc -i netrc.ml > netrc.mli 可以自动生成mli文件【相当于生成interface】
我们注意到module type sig 在ml文件里面出现了,然后生成的mli文件又出现了。。
看到没有,这就是我说的 module type 在哪里定义,module 就在哪里实现。
module Netrc它实现了Netrc_type sig中定义的方法。
我们在sig定义了三个方法,然后我们实现的时候,实现了3个方法。这两边就对上号了。
领取专属 10元无门槛券
私享最新 技术干货