我想定义一个界面PROPERTY
,并且至少有两个模块Type
和Formula
匹配它:
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)我希望Type
的构造函数可以在外部调用(如果需要,可以调用所有程序)
2)Formula
的某些值的一部分包含Types
的值,例如Fplus (5, Type.Tint)
的类型为Formula
; Formula
的某些功能也需要调用Type
的某些功能,例如,Formula.union
需要调用Type.union
有人能告诉我如何修改上述声明以满足我的要求吗?如有必要,可以添加额外的模块......
答案 0 :(得分:6)
不要将: PROPERTY
密封模型应用于模块声明。这会隐藏返回模块的额外信息。你应该使用:
module Type = struct .. end
module Formula = struct .. end
如果您仍想检查Type
和Formula
是否满足PROPERTY
界面,可以单独执行此操作:
let () =
ignore (module Type : PROPERTY);
ignore (module Formula : PROPERTY);
()