我已經爲格式能夠集合算符,具體如下:擴展OCaml的地圖來formattable地圖
module type POrderedType =
sig
type t
val compare : t -> t -> int
val format : Format.formatter -> t -> unit
end
module type SET =
sig
include Set.S
val format : Format.formatter -> t -> unit
end
module MakeSet (P : POrderedType) : SET with type elt = P.t
的實現是直截了當:
module MakeSet (P : OrderedType) =
struct
include Set.Make(P)
let format ff s =
let rec format' ff = function
| [] ->()
| [v] -> Format.fprintf ff "%a" format v
| v::tl -> Format.fprintf ff "%a,@ %a" format v format' tl in
Format.fprintf ff "@[<4>%[email protected]]" format' (elements s)
end
我想要做類似的事情地圖。 POrderedType
是好的鑰匙,但我需要的值的簡單類型:
module type Printable =
sig
type t
val format : Format.formatter -> t -> unit
end
然後,我想做相似,我已經爲套做了什麼,但我遇到了以下問題。 Map.S
值的類型爲+'a t
。我無法想出一個方法來包含Map.S
定義,同時將'a
限制爲Printable.t
。我要的是類似如下(忽略了一個事實,這是非法的):
module MakeMap (Pkey : POrderedType) (Pval : Printable) :
MAP with type key = Pkey.t and type 'a t = 'a t constraint 'a = Pval.t
有沒有辦法做我想要的東西,而無需手動複製地圖的整個簽名?