Как определить сигнатуру модуля, реализация модуля которого функтор

Допустим, у меня есть модуль M, параметризованный модулем F:

module M (F : sig type id type data end) =
struct
 type idtype = F.id
 type datatype = F.data
 type component = { id : idtype; data : datatype }
 let create id data = { id; data }
 let get_comp_data comp = comp.data
 let get_comp_id comp = comp.id
end

, поэтому я использую его так:

module F1 = struct type id = int type data = float end
module MF1 = M(F1)

let comp = MF1.create 2 5.0
let id = MF1.get_comp_id comp

Теперь, если Я хочу, чтобы Mсоответствовал подписи S:

module type S = 
sig
  type idtype
  type datatype 
  type component
  val create : idtype -> datatype -> component
  val get_comp_data : component -> datatype
  val get_comp_id : component -> idtype
end

module F1 = struct type id = int type data = float end
module MF1 = (M(F1) : S)

let comp = MF1.create 2 5.0
let id = MF1.get_comp_id comp

меня беспокоит то, что для определения get_comp_dataи get_comp_idя нужно указать idtypeи тип данныхв модуле S; теперь представьте, что у меня есть другие типы записей в Mс их собственными типами, у меня будет дюжина типов для указания в S? Есть ли более простой способ избежать этого?

6
задан codablank1 30 June 2012 в 18:14
поделиться