What is the equivalent to (+1) for the subtraction

2020-04-01 08:47发布

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

3条回答
你好瞎i
2楼-- · 2020-04-01 09:04

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.

查看更多
\"骚年 ilove
3楼-- · 2020-04-01 09:12

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)
查看更多
Deceive 欺骗
4楼-- · 2020-04-01 09:26

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

查看更多
登录 后发表回答