我已經定義了2個模塊Zone
和Zones
,Zones
是的Zones
事業功能的Zone
列表,需要調用的Zone
功能:函子OCaml中一個設計
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
,我想擁有的Zone
的prop
更多的選擇。所以我定義了一個接口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
和ZoneFun
簽名是3個選項中的不同,該實施可以確保ZoneXXX.t
和ZonesXXX.t
是一致的。現在一個很大的問題是如何改變Mis
:
1)如果我做一個仿函數MisFun: PROPERTY -> MIS
,並建立ZoneXXX
和ZonesXXX
內。不知道MisXXX.Zone.t
與all.ml
的Zone.t
相同,或者MisXXX.Zones.t
與all.ml
的Zones.t
相同。 2)如果我做了一個仿函數MisFun: Zone -> Zones -> MIS
,它不知道MisXXX.Zone.t
和MisXXX.Zones.t
是連貫的。
有沒有人知道如何解決1)和2)?
在備選方案(1),'ZoneFun'被內部'ZonesFun'施加。 – SoftTimur
我已經更新了OP,它比我們想象的更復雜... – SoftTimur
查看我的第二次更新以獲得更全面的答案。 –