(* 我想重新表述我之前发布的一个问题,以使其更清晰并引起更多关注......我认为这个问题仍然很有趣...... *)
我定义了一个模块类型ZONE
如下:
(* part of zone.ml *)
module type ZONE =
sig
type info
type prop
type t = { s: string; p: prop; i: info }
val f1 : t -> string
end
wherei: info
用于包含各种信息,有助于避免重复计算。它不会总是相同的,因为它取决于构建Prop
a的源。Zone
例如,这是一个函子,用于从 type 的模块构建Zone
typeZONE
的模块PROP
,具有基本的info
:
(* part of zone.ml *)
module ZoneFun (Prop : PROP) = struct
type info = { a: int }
type prop = Prop.t
type t = { s: string; p: prop; i: info }
let f0 z = "f0"
...
end
这是另一个构建Zone
类型模块的函子ZONE
,相对更复杂info
:
(* zoneFunPrec.ml *)
module ZoneFunPrec (Prop: PROP) (Prec: ZONESM) = struct
type info = { a: int; b: Prec.t }
type prop = Prop.t
type t = { s: string; p: prop; i: info }
let get_prec z = z.info.prec
let f0 z = "f0"
...
end
然后我可以按如下方式使用函子:
module ZoneC = ZoneFun(PropC)
module ZoneA = ZoneFunPrec(PropA)(ZonesmB)
问题是,type info
和get_prec
(ZoneFun
有它,而ZoneFunPrec
没有) 是这两个函子的唯一区别;它们的type prop
和type t
是相同的,它们的功能f0
,f1
...(有很多)也完全一样。
所以我想知道如何避免两次实施f0
,f1
等......
有没有人有重组模块/函子以实现这一目标并使它们有意义的想法?