Generalized Types vs Overloaded Operators
The operators +, *, -, <, and some others are overloaded. They represent one of two possible operations. E.g., int addition or real addition.
The ambiguity must be resolved before the val can be returned. A function is a value and forces the resolution of the ambiguity.
val sqr = fn : int -> int