Typeclassestype hint_info = (Names.Id.Set.t * Pattern.constr_pattern) hint_info_gentype class_method = {meth_name : Names.Name.t; |
meth_info : hint_info option; |
meth_const : Names.Constant.t option; |
}type typeclass = {cl_univs : UVars.AbstractContext.t; | (* The toplevel universe quantification in which the typeclass lives. In particular, |
cl_impl : Names.GlobRef.t; | (* The class implementation: a record parameterized by the context with defs in it or a definition if the class is a singleton. This acts as the class' global identifier. *) |
cl_context : Constr.rel_context; | (* Context in which the definitions are typed. Includes both typeclass parameters and superclasses. *) |
cl_props : Constr.rel_context; | (* Context of definitions and properties on defs, will not be shared *) |
cl_projs : class_method list; | (* The methods implementations of the typeclass as projections. Some may be undefinable due to sorting restrictions or simply undefined if no name is provided. The |
cl_strict : bool; | (* Whether we use matching or full unification during resolution *) |
cl_unique : bool; | (* Whether we can assume that instances are unique, which allows no backtracking and sharing of resolution. *) |
}This module defines type-classes
val instances : Names.GlobRef.t -> instance list optionNone if not a class
val instances_exn : Environ.env -> Evd.evar_map -> Names.GlobRef.t -> instance listraise TypeClassError if not a class
val typeclasses : unit -> typeclass listval all_instances : unit -> instance listval load_class : typeclass -> unitval load_instance : instance -> unitval remove_instance : instance -> unitval class_info : Names.GlobRef.t -> typeclass optionNone if not a class
val class_info_exn : Environ.env -> Evd.evar_map -> Names.GlobRef.t -> typeclassraise TypeClassError if not a class
val dest_class_app : Environ.env -> Evd.evar_map -> EConstr.constr -> (typeclass * EConstr.EInstance.t) * Constr.constr listThese raise a UserError if not a class. Caution: the typeclass structures is not instantiated w.r.t. the universe instance. This is done separately by typeclass_univ_instance.
val typeclass_univ_instance : typeclass UVars.puniverses -> typeclassGet the instantiated typeclass structure for a given universe instance.
val class_of_constr : Environ.env -> Evd.evar_map -> EConstr.constr -> (EConstr.rel_context * ((typeclass * EConstr.EInstance.t) * Constr.constr list)) optionJust return None if not a class
val instance_impl : instance -> Names.GlobRef.tval hint_priority : instance -> int optionval is_class : Names.GlobRef.t -> boolReturns the term and type for the given instance of the parameters and fields of the type class.
val instance_constructor : typeclass EConstr.puniverses -> EConstr.t list -> EConstr.t option * EConstr.ttype evar_filter = Evar.t -> Evar_kinds.t Stdlib.Lazy.t -> boolFilter which evars to consider for resolution.
val all_evars : evar_filterval all_goals : evar_filterval no_goals : evar_filterval no_goals_or_obligations : evar_filterResolvability. Only undefined evars can be marked or checked for resolvability. They represent type-class search roots.
A resolvable evar is an evar the type-class engine may try to solve An unresolvable evar is an evar the type-class engine will NOT try to solve
val make_unresolvables : (Evar.t -> bool) -> Evd.evar_map -> Evd.evar_mapval is_class_evar : Evd.evar_map -> Evd.undefined Evd.evar_info -> boolval is_class_type : Evd.evar_map -> EConstr.types -> boolval resolve_typeclasses : ?filter:evar_filter -> ?unique:bool -> ?fail:bool -> Environ.env -> Evd.evar_map -> Evd.evar_mapval get_filtered_typeclass_evars : evar_filter -> Evd.evar_map -> Evar.Set.tval error_unresolvable : Environ.env -> Evd.evar_map -> Evar.Set.t -> 'aval set_solve_all_instances : (Environ.env -> Evd.evar_map -> evar_filter -> bool -> bool -> Evd.evar_map) -> unitA plugin can override the TC resolution engine by calling these two APIs. Beware this action is not registed in the summary (the Undo system) so it is up to the plugin to do so.
val resolve_one_typeclass : ?unique:bool -> Environ.env -> Evd.evar_map -> EConstr.types -> Evd.evar_map * EConstr.constrval set_solve_one_instance : (Environ.env -> Evd.evar_map -> EConstr.types -> Evd.evar_map * EConstr.constr) -> unit