我为可格式化的集合制作了一个仿函数,如下所示:
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
值有类型+'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 的整个签名的情况下做我想做的事情?