To expand on sepp2k's answer a bit: if you try to compile the following (or load it into GHCi), you get an error:
import Data.List (sort)
f = head . sort
This is a violation of the monomorphism restriction because we have a class constraint (introduced by sort
) but no explicit arguments: we're (somewhat mysteriously) told that we have an Ambiguous type variable
in the constraint Ord a
.
Your example (let x = 3
) has a similarly ambiguous type variable, but it doesn't give the same error, because it's saved by Haskell's "defaulting" rules:
Any monomorphic type variables that
remain when type inference for an
entire module is complete, are
considered ambiguous, and are resolved
to particular types using the
defaulting rules (Section 4.3.4).
See this answer for more information about the defaulting rules—the important point is that they only work for certain numeric classes, so x = 3
is fine while f = sort
isn't.
As a side note: if you'd prefer that x = 3
end up being an Int
instead of an Integer
, and y = 3.0
be a Rational
instead of a Double
, you can use a "default declaration" to override the default defaulting rules:
default (Int, Rational)