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=…
。