Constraint Satisfaction Outcomes
1. If the type of any expression is overconstrained, then there is an inconsistency in the constraints. There is a type error.
2. If the constraints produce a unique concrete type for each expression or subexpression, then type inference is successful.
3. If there are not enough constraints to force a concrete type for each subexpression, then the problem is underconstrained, and the ML compiler may attempt to represent the type of each subexpression with a type schema that is as general as possible. E.g. x : 'a