次のように、フォーマット可能なセットのファンクターを作成しました。
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>%a@]" format' (elements s)
end
私は地図で似たようなことをしたいと思っていました。 POrderedType
キーには問題ありませんが、値にはもっと単純な型が必要です:
module type Printable =
sig
type t
val format : Format.formatter -> t -> unit
end
次に、セットで行ったことと同様のことをしたかったのですが、次の問題に遭遇しました。 Map.S
値には type があり+'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
Map の署名全体を手動でコピーせずに、やりたいことを行う方法はありますか?