我已经定义了 2 个模块,Zone并且是需要调用函数的原因函数列表:ZonesZonesZoneZonesZone
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
现在,我想为propof提供更多选择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,并在里面构建ZoneXXXand ZonesXXX。它无法知道MisXXX.Zone.t与Zone.tof相同all.ml或与ofMisXXX.Zones.t相同。Zones.tall.ml
2)如果我做一个仿函数MisFun: Zone -> Zones -> MIS,它不能知道MisXXX.Zone.t并且MisXXX.Zones.t是连贯的。
有谁知道如何解决1)和2)?