我已经定义了 2 个模块,Zone
并且是需要调用函数的原因函数列表:Zones
Zones
Zone
Zones
Zone
module Zone = struct
type t =
{ ...
prop: bool }
...
end
modules Zones = struct
type t =
| ZSbot
| ZS of Zone.t list
| ZStop
...
end
原则文件all.ml
使用Zones
和Mis
模块, mis.ml
包含适用于两者的函数Zone.t
,Zones.t
例如val Mis.make : Zone.t -> Zones.t
.
open Zones
open Mis
type t = { zs: Zones.t }
...
Mis.make z
现在,我想为prop
of提供更多选择Zone
。所以我定义了一个接口和 2个PROPERTY
模块Type
并Formula
匹配它,这样我就可以为. 现在我可以想象新的几种可能性:Zone
... prop: Property.t ...
all.ml
(* 1 *)
open Zones
module ZonesType = ZonesFun(Type)
module ZonesFormula = ZonesFun(Formula)
type t = { zstype: ZonesType.t; zsformula: ZonesFormula }
(* 3 *)
open Zones
module ZonesType = ZonesFun(ZoneFun(Type))
module ZonesFormula = ZonesFun(ZoneFun(Formula))
type t = { zstype: ZonesType.t; zsformula: ZonesFormula }
(* 4 *)
open Zones
module ZoneType = ZoneFun(Type)
module ZoneFormula = ZoneFun(Formula)
module ZonesType = ZonesFun(ZoneType)
module ZonesFormula = ZonesFun(ZoneFormula)
type t = { zstype: ZonesType.t; zsformula: ZonesFormula }
ZonesFun
虽然 3 个选项的和的签名ZoneFun
不同,但这种实现可以确保ZoneXXX.t
并且ZonesXXX.t
是连贯的。现在一个大问题是如何改变Mis
:
1)如果我制作一个仿函数MisFun: PROPERTY -> MIS
,并在里面构建ZoneXXX
and ZonesXXX
。它无法知道MisXXX.Zone.t
与Zone.t
of相同all.ml
或与ofMisXXX.Zones.t
相同。Zones.t
all.ml
2)如果我做一个仿函数MisFun: Zone -> Zones -> MIS
,它不能知道MisXXX.Zone.t
并且MisXXX.Zones.t
是连贯的。
有谁知道如何解决1)和2)?