module Id: sig
.. end
类型标识符。
类型标识符是一个表示类型的值。给定两个类型标识符,可以测试它们的 相等性 来证明它们表示相同的类型。请注意
- 不相等的标识符并不意味着类型不相等:一个给定的类型可以由多个标识符表示。
- 类型标识符可以被编组,但它们在解组时会获得一个新的、不同的标识,因此相等性会丢失。
请参阅 示例 以了解如何使用。
类型标识符
type !'a
t
val make : unit -> 'a t
val uid : 'a t -> int
val provably_equal : 'a t -> 'b t -> ('a, 'b) Type.eq option
provably_equal i0 i1
如果标识符 i0
等于 i1
则为 Some Equal
,否则为 None
。
示例
以下显示了如何使用类型标识符来实现一个简单的异构键值字典。与 Map
的键映射到单一、同构类型的值不同,这个字典可以将不同类型的值与每个键关联。
module Dict : sig
type t
type 'a key
val key : unit -> 'a key
val empty : t
val add : 'a key -> 'a -> t -> t
val remove : 'a key -> t -> t
val find : 'a key -> t -> 'a option
end = struct
type 'a key = 'a Type.Id.t
type binding = B : 'a key * 'a -> binding
type t = (int * binding) list
let key () = Type.Id.make ()
let empty = []
let add k v d = (Type.Id.uid k, B (k, v)) :: d
let remove k d = List.remove_assoc (Type.Id.uid k) d
let find : type a. a key -> t -> a option = fun k d ->
match List.assoc_opt (Type.Id.uid k) d with
| None -> None
| Some (B (k', v)) ->
match Type.Id.provably_equal k k' with
| Some Type.Equal -> Some v
| None -> assert false
end