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 - (unary minus) operator negates the value of the operand. The operand can have any arithmetic type. The result is not an lvalue. For example, if quality has the value 100 , -quality has the value -100 . The result has the same type as the operand after integral promotion.
Unary - changes the sign of a numeric expression to the right of the operator. Unary + has no effect on an expression; it is included for completeness and because some programmers like to use it to emphasize that a number is positive.
The unary operators require only one operand; they perform various operations such as incrementing/decrementing a value by one, negating an expression, or inverting the value of a boolean. The increment/decrement operators can be applied before (prefix) or after (postfix) the operand.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With