Helper mixin template wrapping functions in a foralls. Given a template symbol, a list a type variables Variables, and a name $(name), this mixin generates two symobls underscore ~ name and name. Where underscore ~ name is a private symbol with free variables and name is the former wrapped in a forall type.
Forall types (called "∀" is system-f) binds a type variable x in a type σ. Forall's purpose is represent a type that can be specialized to something else.
A Type Variable is a representation of an unknown type. The only known property about a type variable is it's size κ. Two type variables with different names represent two different incompatible types. Functions that use unbounded type variables should always be private and wrap said function with a forall type.
Substitute σx into σ, replacing all type variables with name x. This function is primarily used by Π's specialize function. Structs and Classes can implement SubstituteImpl(σx, x) to allow specialization.
A type lambda takes a value with a free type variable x and binds it inside a Forall type.
N arity type lambda.