tôi đã xác định 2 module Zone
và Zones
, Zones
là danh sách các Zone
, các chức năng nguyên nhân của Zones
cần phải gọi chức năng của Zone
:Một thiết kế của functors trong OCaml
module Zone = struct
type t =
{ ...
prop: bool }
...
end
modules Zones = struct
type t =
| ZSbot
| ZS of Zone.t list
| ZStop
...
end
Một tập tin nguyên tắc all.ml
sử dụng Zones
và Mis
mô-đun, mis.ml
chứa các chức năng hoạt động trên cả hai Zone.t
và Zones.t
, ví dụ val Mis.make : Zone.t -> Zones.t
.
open Zones
open Mis
type t = { zs: Zones.t }
...
Mis.make z
Bây giờ, tôi muốn có thêm tùy chọn cho prop
của Zone
. Vì vậy, tôi xác định một giao diện PROPERTY
và 2 mô-đun Type
và Formula
phù hợp với nó, để tôi có thể thực hiện các functors cho Zone
và các địa chỉ khác trong đó ... prop: Property.t ...
. Bây giờ tôi có thể tưởng tượng một vài khả năng cho cái mới 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 }
Mặc dù chữ ký của ZonesFun
và ZoneFun
là khác nhau giữa 3 lựa chọn, thực hiện điều này có thể đảm bảo ZoneXXX.t
và ZonesXXX.t
là chặt chẽ. Bây giờ một vấn đề lớn là làm thế nào để thay đổi Mis
:
1) Nếu tôi thực hiện một functor MisFun: PROPERTY -> MIS
và xây dựng ZoneXXX
và ZonesXXX
bên trong. Không thể biết MisXXX.Zone.t
giống với Zone.t
của all.ml
hoặc MisXXX.Zones.t
giống với Zones.t
trong số all.ml
.
2) Nếu tôi thực hiện một functor MisFun: Zone -> Zones -> MIS
, nó không thể biết MisXXX.Zone.t
và MisXXX.Zones.t
là mạch lạc.
Có ai biết cách giải quyết cả 1) và 2) không?
Trong Option (1), 'ZoneFun' được áp dụng trong 'ZonesFun'. – SoftTimur
Tôi đã cập nhật OP, nó phức tạp hơn những gì chúng tôi nghĩ ... – SoftTimur
Xem bản cập nhật thứ hai của tôi cho một câu trả lời rộng hơn. –