Type inference: infer types of expressions automatically
Assign each declared variable a fresh type variable
- Result of function is an implicit variable
- Share argument and result type variables across function cases
- Each reference to a let-bound polymorphic identifier (roughly, a named function) gets separate type variables
Each expression in construct places constraints on the types of its operands