Std.Typerepruntime type representations
type _ t = | Int : int t | |
| Int32 : int32 t | |
| Int64 : int64 t | |
| Nativeint : nativeint t | |
| Char : char t | |
| Float : float t | |
| String : string t | |
| Bytes : bytes t | |
| Bool : bool t | |
| Unit : unit t | |
| Option : 'a t -> 'a option t | |
| List : 'a t -> 'a list t | |
| Array : 'a t -> 'a array t | |
| Lazy : 'a t -> 'a lazy_t t | |
| Ref : 'a t -> 'a ref t | |
| Function : ('dom t * 'rng t) -> ('dom -> 'rng) t | |
| Tuple : 'a Tuple.t -> 'a t | |
| Record : 'a Record.t -> 'a t | |
| Variant : 'a Variant.t -> 'a t | (* The |
| Named : ('a Named.t * 'a t lazy_t option) -> 'a t |
module Named : sig ... endmodule Tuple : sig ... endinclude Variant_and_record_intf.S with type 'a t := 'a tmodule Tag_internal : sig ... endmodule Tag : sig ... endWitness of a tag, that is an item in a variant type, also called an "applied variant Constructor"
module Variant_internal : sig ... endmodule Variant : sig ... endmodule Field_internal : sig ... endmodule Field : sig ... endWitness of a field, that is an item in a record type. The first parameter is the record type, the second is the type of the field. Example:
module Record_internal : sig ... endmodule Record : sig ... endsame t t' will return a proof a equality if t and t' are the same type. One can think of two types being the same as two types whose values could be for example put in a list together. It is worth noting that this function *does not* operate compatiblity diffs between two different types with the same structure. Example:
module M1 = struct
type t = {
a : int;
b : float;
} [@@deriving typerep]
end
module M2 = struct
type t = {
a : int;
b : float;
} [@@deriving typerep]
end
[%test_result:bool] ~expect:false (same M1.typerep_of_t M2.typerep_of_t)
type a = int with typerep
type b = int with typerep
[%test_result:bool] ~expect:true (same typerep_of_a typerep_of_b)This is meant to recover type equality hidden by existential constructors.
Basically this function does structural equality for everything except variant types, record types, and named types with no lazy definition exposed. This last case is about types that are defined with typerep(abstract)
val same_witness : 'a t -> 'b t -> ('a, 'b) Type_equal.t optionval same_witness_exn : 'a t -> 'b t -> ('a, 'b) Type_equal.tval typename_of_t : 'a t -> 'a Typename.t