Tôi đã thực hiện một functor cho bộ định dạng có thể, như sau:Mở rộng OCaml Maps để formattable Maps
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
Thực hiện điều này rất đơn giản:
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
tôi muốn làm một cái gì đó tương tự với bản đồ. POrderedType
là tốt cho các phím, nhưng tôi cần một kiểu đơn giản hơn cho các giá trị:
module type Printable =
sig
type t
val format : Format.formatter -> t -> unit
end
Sau đó, tôi muốn làm một cái gì đó tương tự như những gì tôi đã làm cho bộ, nhưng tôi chạy vào vấn đề sau đây. Giá trị Map.S
có loại +'a t
. Tôi không thể tìm ra cách để bao gồm định nghĩa Map.S
trong khi hạn chế 'a
thành Printable.t
.
module MakeMap (Pkey : POrderedType) (Pval : Printable) :
MAP with type key = Pkey.t and type 'a t = 'a t constraint 'a = Pval.t
Có cách nào để làm những gì tôi muốn mà không sao chép toàn bộ chữ ký của Bản đồ bằng tay: một cái gì đó như sau (bỏ qua thực tế là nó là bất hợp pháp) Những gì tôi muốn là?