What is the equivalent to (+1) for the subtraction, since (-1) is seen as a negative number? [duplicate]

StackOverflow https://stackoverflow.com/questions/12831217

  •  06-07-2021
  •  | 
  •  

Question

Possible Duplicate:
Currying subtraction

I started my first haskell project that is not from a tutorial, and of course I stumble on the simplest things.

I have the following code:

moveUp y = modifyMVar_ y $ return . (+1)
moveDn y = modifyMVar_ y $ return . (-1)

It took me some time to understand why my code wouldn't compile: I had used (-1) which is seen as negative one. Bracketting the minus doesn't help as it prefixes it and makes 1 its first parameter.

In short, what is the point free version of this?

dec :: Num a => a -> a
dec x = x - 1
Was it helpful?

Solution

I believe you want the conveniently-named subtract function, which exists for exactly the reason you've discovered:

subtract :: Num a => a -> a -> a

the same as flip (-).

Because - is treated specially in the Haskell grammar, (- e) is not a section, but an application of prefix negation. However, (subtract exp) is equivalent to the disallowed section.

If you wanted to write it pointfree without using a function like subtract, you could use flip (-), as the Prelude documentation mentions. But that's... kinda ugly.

OTHER TIPS

If the above-mentioned subtract is too verbose, you could try something like (+ (-1)) or (-1 +).

You can use the subtract function (which is in the Standard Prelude).

moveDn y = modifyMVar_ y $ return . (subtract 1)

You can also use flip to reorder the parameters that - takes.

moveDn y = modifyMVar_ y $ return . (flip (-) 1)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top