All of the following expressions get evaluated without mishap:
(+2) 1 -- 3
(*2) 1 -- 2
((-)2) 1 -- 1
(2-) 1 -- 1
(/2) 1 -- 0.5
(2/) 1 -- 2.0
but not this one:
(-2) 1 -- the inferred type is ambiguous
GHC throws some error about the inferred type being ambiguous. Why?
The first six parenthesised expressions are sections, i.e. functions that take one argument and "put it on the missing side of the infix operator" (see this haskell.org wiki). In contrast, (-2)
is, not a function, but a number (negative 2):
λ> :t (-2)
(-2) :: Num a => a
If you write
λ> (-2) 1
it looks like you're trying to apply (-2)
(a number) to 1
(which is not possible), and GHCi rightfully complains:
Could not deduce (Num (a0 -> t))
arising from the ambiguity check for ‘it’
from the context (Num (a -> t), Num a)
bound by the inferred type for ‘it’: (Num (a -> t), Num a) => t
at <interactive>:3:1-6
The type variable ‘a0’ is ambiguous
When checking that ‘it’
has the inferred type ‘forall a t. (Num (a -> t), Num a) => t’
Probable cause: the inferred type is ambiguous
If you want a function that subtracts 2
from another number, you can use
(subtract 2)
Compare its type,
λ> :t (subtract 2)
(subtract 2) :: Num a => a -> a
to that of (-2)
(see above).
Parenthesizing the minus operator turns it into a normal (prefix) function that takes two arguments; therefore ((-) 2)
is not a section, but a partially applied function.