模块和接口的设计

时间:2012-12-18 13:10:40

标签: ocaml

我想定义一个界面PROPERTY,并且至少有两个模块TypeFormula匹配它:

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

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

1 个答案:

答案 0 :(得分:6)

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

 module Type = struct .. end
 module Formula = struct .. end

如果您仍想检查TypeFormula是否满足PROPERTY界面,可以单独执行此操作:

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