## Structs§

- A “canonicalized” type
`V`

is one where all free inference variables have been rewritten to “canonical vars”. These are numbered starting from 0 in order of first appearance. - Information about a canonical variable that is included with the canonical value. This is sufficient information for code to create a copy of the canonical value in some other inference context, with fresh inference variables replacing the canonical values.
- A set of values corresponding to the canonical variables from some
`Canonical`

. You can give these values to`canonical_value.instantiate`

to instantiate them into the canonical value at the right places.

## Enums§

- Rust actually has more than one category of type variables; notably, the type variables we create for literals (e.g., 22 or 22.) can only be instantiated with integral/float types (e.g., usize or f32). In order to faithfully reproduce a type, we need to know what set of types a given type variable can be unified with.
- Describes the “kind” of the canonical variable. This is a “kind” in the type-theory sense of the term – i.e., a “meta” type system that analyzes type-like values.