5

モジュール型ZONEと 2 つのファンクター (ZoneFunZoneFunPrec) を定義してビルドしました。

(* zone.ml *)
module type ZONE =
sig
  type info
  type prop
  type t = { p: prop; i: info }
  val f1 : t -> string
end

module ZoneFun (Prop : PROP) = struct
  type info = { a: int }
  type prop = Prop.t
  type t = { p: prop; i: info }
  let f1 z = "f1"
end

(* zoneFunPrec.ml *)
module ZoneFunPrec (Prop: PROP) (Prec: ZONESM) = struct
  type info = { a: int; b: Prec.t }
  type prop = Prop.t
  type t = { p: prop; i: info }
  let f1 z = "f1"
  let get_prec z = z.info.prec
end   

これら 2 つのファンクターの一部の関数は、異なる方法で実装されています (例: f0)。一部の機能はまったく同じです (例: f1)。私の質問は、これらの一般的な機能を抽出して、それらを2回実装するのを避ける方法ですか?

編集:(より明確にするために、より具体的な情報を提供する必要があることを認識しています...変更について申し訳ありません...)

と にはいくつかの違いがZoneFunありZoneFunPrecます。

1) それらtype infoは同じではありません 2)ZoneFunPrec 持っget_precZoneFunいないものを持っていZONEます。

後で、ゾーンを作成して構築するmodule ZoneB = ZoneFun(B)ことができます...module ZoneA = ZoneFunPrec(C)(ZonesmD)

4

1 に答える 1

1

次のことができます。

module ZoneFunPrec (Prop: PROP) = struct
  module Zone1 = ZoneFun(Prop)
  type prop = Prop.t
  type t = string
  let f0 x = "f0 in ZoneFunPrec"
  let f1 = Zone1.f1
end

ただし、これは、ファンクターに署名を割り当てない場合にのみ機能します

module ZoneFunPrec (Prop: PROP) : ZONE = ...

不透明な帰属が必要な場合は、次のようにすることができます

(* No ascription here *)
module SharedFn (Prop : PROP) = struct
  type prop = Prop.t
  type t = string
  let f0 x = "f0 in ZoneFun"
  let f1 x = "f1"
end

(* Ascribe the module to hide the types *)  
module ZoneFun (Prop : PROP) : ZONE = struct
  module Shared = SharedFn(Prop)
  let f1 = Shared.f1
  ...defs specific to ZONE...
end 

module ZoneFunPrec (Prop: PROP) : ZONE_PREC = struct
  module Shared = SharedFn(Prop)
  type prop = Prop.t
  type t = string
  let f0 x = "f0 in ZoneFunPrec"
  let f1 = Shared.f1
  ...defs specific to ZONE_PREC...
end

を使用include Sharedして入力を節約することはできますが、型は抽象的であるため、あまり柔軟ではありません。

于 2013-09-10T18:00:53.790 に答える