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?

1 Answers 11

up vote 6 down vote accepted

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).


Terminology addendum (after OP's edit)

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.

upvote
  flag
Oh, I was initially confused with LiveScript, where (-1) is number while (- 1) is partial function. – sof
upvote
  flag
@sof Whitespace doesn't matter, in this case. – Jubobs
upvote
  flag
Yes, I see Haskell is usually whitespace insensitive except for indented code block. – sof
upvote
  flag
Also you could add that (/ 2) is \x->x/2 and ((/) 2) is \x->2/x – Karol S
upvote
  flag
@KarolS That should be understood based on the first sentence in my answer. – Jubobs

Not the answer you're looking for? Browse other questions tagged or ask your own question.