Ocaml 模块及接口设计

Ocaml 模块及接口设计,ocaml,Ocaml,我想定义一个接口属性,以及至少两个与之匹配的模块类型和公式: module type PROPERTY = sig type t val top : t val bot : t val to_string: t -> string val union: t -> t -> t val intersection: t -> t -> t end module Type = (struct type t = | Tbot | T

我想定义一个接口
属性
,以及至少两个与之匹配的模块
类型
公式

module type PROPERTY =
sig
  type t
  val top : t
  val bot : t
  val to_string: t -> string
  val union: t -> t -> t
  val intersection: t -> t -> t
end

module Type = (struct
  type t =
   | Tbot
   | Tint
   | Tbool
   | Ttop
  ...      
end: PROPERTY)

module Formula = (struct
  type t =
   | Fbot
   | Ftop
   | Fplus of int * Type.t
   ...
  let union = 
   ... Type.union ...
  ...      
end: PROPERTY)
有两个要求:

1) 我想
类型的构造函数可以在外部调用(如果需要,可以调用所有程序)

2)
公式
的某些值的一部分包含
类型的值
,例如
Fplus(5,Type.Tint)
类型为
公式
;另外,
Formula
的一些函数需要调用
类型的一些函数,例如,
Formula.union
需要调用
Type.union


有人能告诉我如何修改上述声明以满足我的要求吗?如有必要,可以添加额外的模块…

不要将
:PROPERTY
密封强制转换应用于模块声明。这会对返回的模块隐藏额外信息。你应该使用:

 module Type = struct .. end
 module Formula = struct .. end
如果仍要检查
类型
公式
是否满足
属性
界面,可以分别执行以下操作:

 let () =
   ignore (module Type : PROPERTY);
   ignore (module Formula : PROPERTY);
   ()

应用
:PROPERTY
的目的是,稍后我将使用
PROPRETY
作为参数生成一个函子:
module ZFUN=functor(Prop:PROPERTY)->struct。。。结束
您不需要在
类型
公式
的声明处强制使用抽象接口。当您应用
ZFUN
functor.Drive-by注释(与gasche的回复正交)时,将发生接口满意度检查:您可以方便地编写带有签名归属的声明,如
module X:SIG=…