Why is the unary minus operator problematic in this expression: (- 2) 1?

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?

-

Each of these parenthesized expressions but `(-2)` (edit: and `((-) 2)`) 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).

`(-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.
Oh, I was initially confused with `LiveScript`, where `(-1)` is number while `(- 1)` is partial function. – sof
Yes, I see `Haskell` is usually whitespace insensitive except for indented code block. – sof
Also you could add that `(/ 2)` is `\x->x/2` and `((/) 2)` is `\x->2/x` – Karol S