私は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
。そこで、インターフェースPROPERTY
と 2 つのモジュールを定義し、それ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
とのシグネチャはZoneFun
3 つのオプション間で異なりますが、この実装は確実ZoneXXX.t
でZonesXXX.t
一貫性があります。ここで大きな問題の 1 つは、次のように変更する方法Mis
です。
1) functorを作成し、内部MisFun: PROPERTY -> MIS
に and を構築するZoneXXX
とします。の と同じか、のと同じかを知ることはできZonesXXX
ません。MisXXX.Zone.t
Zone.t
all.ml
MisXXX.Zones.t
Zones.t
all.ml
2) functor を作成するとMisFun: Zone -> Zones -> MIS
、それは知ることができず、一貫性がMisXXX.Zone.t
あります。MisXXX.Zones.t
1)と2)の両方を解決する方法を知っている人はいますか?