Application operator. This operator is redundant, since ordinary
application (f x) means the same as (f $ x).
However, $ has low, right-associative binding precedence, so it
sometimes allows parentheses to be omitted; for example:
f $ g $ h x = f (g (h x))
It is also useful in higher-order situations, such as map
($ 0) xs, or zipWith ($) fs xs.
Note that ($) is representation-polymorphic in its
result type, so that foo $ True where foo :: Bool
-> Int# is well-typed.