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