我已经定义了一个模块类型ZONE
和两个仿函数(ZoneFun
和ZoneFunPrec
)来构建它:
(* zone.ml *)
module type ZONE =
sig
type info
type prop
type t = { p: prop; i: info }
val f1 : t -> string
end
module ZoneFun (Prop : PROP) = struct
type info = { a: int }
type prop = Prop.t
type t = { p: prop; i: info }
let f1 z = "f1"
end
(* zoneFunPrec.ml *)
module ZoneFunPrec (Prop: PROP) (Prec: ZONESM) = struct
type info = { a: int; b: Prec.t }
type prop = Prop.t
type t = { p: prop; i: info }
let f1 z = "f1"
let get_prec z = z.info.prec
end
这 2 个函子中的一些函数的实现方式不同(例如f0
);有些功能完全相同(例如f1
)。我的问题是如何提取这些常用功能以避免两次实现它们?
编辑:(我意识到我需要提供更具体的信息以使其更清楚......抱歉改变......)
ZoneFun
和之间有一些区别ZoneFunPrec
:
1)他们type info
不一样 2)ZoneFunPrec
有没有,并且不需要它的get_prec
签名。ZoneFun
ZONE
所以以后我可以写作module ZoneB = ZoneFun(B)
并module ZoneA = ZoneFunPrec(C)(ZonesmD)
建立区域......