package ppx_typerep_conv
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=e71729ed13a3cafd8f541056340bf167e8b510f3090ff5825402ed61af3b5e9f
Description
Part of the Jane Street's PPX rewriters collection.
Published: 21 Mar 2022
README
ppx_typerep_conv
Automatic generation of runtime types from type definitions.
This syntax extension defines the type-conv generator [@@deriving typerep]
, which creates a (runtime) value (called typerep_of_$typename
) representing the type definition (see typerep
for more information). It is intended to be the main creator of values of type Typerep.t
.
This generator supports mostly core types, not all fancy types like union of polymorphic variants.
A note about signatures
In signatures, ppx_typerep_conv
tries to generate an include of a named interface, instead of a list of value bindings. That is:
type 'a t [@@deriving typerep]
will generate:
include Typerepable.S1 with type 'a t := 'a t
instead of:
val typerep_of_t : 'a Typerep_lib.Std.Typerep.t ‑> 'a t Typerep_lib.Std.Typerep.t
val typename_of_t : 'a Typerep_lib.Std.Typename.t ‑> 'a t Typerep_lib.Std.Typename.t
There are however a number of limitations:
the type has to be named t
the type can only have up to 3 parameters
there shouldn't be any constraint on the type parameters
If these aren't met, then ppx_typerep_conv
will simply generate a list of value bindings.
Weird looking type errors
In some cases, a type can meet all the conditions listed above, in which case the rewriting will apply, but lead to a type error. This happens when the type [t] is an alias to a type which does have constraints on the parameters, for instance:
type 'a s constraint 'a = [> `read ]
val typerep_of_s : ...
val typename_of_s : ...
type 'a t = 'a s [@@deriving_inline typerep]
include Typerep_lib.Typerepable.S1 with type 'a t := 'a t
[@@@end]
will give an error looking like:
Error: In this `with' constraint, the new definition of t
does not match its original definition in the constrained signature:
Type declarations do not match:
type 'a t = 'a t constraint 'a = [> `read ]
is not included in
type 'a t
File "typerepable.mli", line 11, characters 2-11: Expected declaration
Their constraints differ.
To workaround that error, simply copy the constraint on the type which has the [@@deriving]
annotation. This will force generating a list of value bindings.