> :t (+1)
(+1) :: Num a => a -> a
> :t (-1)
(-1) :: Num a => a
How come the second one is not a function? Do I have to write (+(-1))
or is there a better way?
> :t (+1)
(+1) :: Num a => a -> a
> :t (-1)
(-1) :: Num a => a
How come the second one is not a function? Do I have to write (+(-1))
or is there a better way?
This is because (-1)
is interpreted as negative one, however (+1)
is interpreted as the curried function (\x->1+x)
.
In haskell, (a **)
is syntactic sugar for (**) a
, and (** a)
is (\x -> x ** a)
. However (-)
is a special case since it is both a unary operator (negate) and a binary operator (minus). Therefore this syntactic sugar cannot be applied unambiguously here. When you want (\x -> a - x)
you can write (-) a
, and, as already answered in Currying subtraction, you can use the functions negate
and subtract
to disambiguate between the unary and binary -
functions.
Do I have to write (+(-1)) or is there a better way?
I just found a function called subtract
, so I can also say subtract 1
. I find that quite readable :-)
subtract
was made specifically for use in sections. Haskell 2010 / Expressions # Sections "Because - is treated specially in the grammar, (- exp)
is not a section, but an application of prefix negation, as described in the preceding section. However, there is a subtract
function defined in the Prelude such that (subtract exp)
is equivalent to the disallowed section. The expression (+ (- exp))
can serve the same purpose." –
Tannie (-1)
is negative one, as others have noted. The subtract one function is \x -> x-1
, flip (-) 1
or indeed (+ (-1))
.
-
is treated as a special case in the expression grammar. +
is not, presumably because positive literals don't need the leading plus and allowing it would lead to even more confusion.
Edit: I got it wrong the first time. ((-) 1)
is the function "subtract from one", or (\x -> 1-x)
.
subtract 1
–
Pasha © 2022 - 2024 — McMap. All rights reserved.