Structs

Given generic arguments from an obligation and an impl, could these two be unified after replacing parameters in the the impl with inference variables.

Enums

See simplify_type.
Generic parameters are pretty much just bound variables, e.g. the type of fn foo<'a, T>(x: &'a T) -> u32 { ... } can be thought of as for<'a, T> fn(&'a T) -> u32.

Functions

Tries to simplify a type by only returning the outermost injective¹ layer, if one exists.