Mam zdefiniowane 2 moduły Zone
i Zones
, Zones
jest lista Zone
, funkcji przyczynowo z Zones
trzeba zadzwonić funkcje Zone
:Konstrukcja z funktorów w SML
module Zone = struct
type t =
{ ...
prop: bool }
...
end
modules Zones = struct
type t =
| ZSbot
| ZS of Zone.t list
| ZStop
...
end
Zasada plik all.ml
wykorzystuje Zones
i Mis
moduły, mis.ml
zawiera funkcje, które działają zarówno na Zone.t
i Zones.t
, na przykład val Mis.make : Zone.t -> Zones.t
.
open Zones
open Mis
type t = { zs: Zones.t }
...
Mis.make z
Teraz chciałbym mieć więcej opcji dla prop
z Zone
. Tak więc definiuję interfejs PROPERTY
i 2 moduły, dopasowując go, aby móc tworzyć funktory dla Zone
i innych, gdzie ... prop: Property.t ...
. Teraz mogę sobie wyobrazić kilka możliwości dla nowego 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 }
chociaż podpisami ZonesFun
i ZoneFun
różnią się między 3 opcji, to realizacja może upewnić ZoneXXX.t
ZonesXXX.t
i są spójne. Teraz jest jeden duży problem, jak zmienić Mis
:
1) Jeśli zrobię funktor MisFun: PROPERTY -> MIS
i zbudować ZoneXXX
i ZonesXXX
wewnątrz. Nie można wiedzieć, że MisXXX.Zone.t
jest taki sam jak Zone.t
z all.ml
lub MisXXX.Zones.t
jest taki sam jak Zones.t
z all.ml
.
2) Jeśli zrobię funktora MisFun: Zone -> Zones -> MIS
, to nie mogę wiedzieć, że MisXXX.Zone.t
i MisXXX.Zones.t
są spójne.
Czy ktoś wie, jak rozwiązać oba 1) i 2)?
W wariancie (1), 'ZoneFun' stosowana jest wewnątrz' ZonesFun'. – SoftTimur
Zaktualizowałem OP, jest to bardziej skomplikowane niż sądziliśmy ... – SoftTimur
Zobacz moją drugą aktualizację dla szerszej odpowiedzi. –