|
|
# get rid of unary '-' operator
|
|
|
|
|
|
|
|
|
the unary '-' is a very odd case in the report and causes a lot of confusion.
|
|
|
|
|
|
|
|
|
to fix it we can
|
|
|
|
|
|
- make '-' part of the lexical syntax of numbers. so a '-' followed by digits is interpreted as a negative number
|
|
|
- get rid of all other special treatment of '-'
|
|
|
- people can use 'negate' if they want to negate non literals.
|
|
|
- the removal of n + k patterns will make this more attractive
|
|
|
|
|
|
|
|
|
Cons
|
|
|
|
|
|
- This does introduce a syntactic oddity, namely that `-1` is different from `- 1` though syntax highlighting editors could make this distinction obvious.
|
|
|
|
|
|
- It would no longer be possible to write `x-1` to mean "x minus 1", instead it would mean "x applied to the literal -1",
|
|
|
which is counter-intuitive. Also, `x - 1` with spaces would have the "x minus 1" meaning.
|
|
|
|
|
|
- In Haskell 98, '-' is explicitly excluded from right sections, so:
|
|
|
|
|
|
```wiki
|
|
|
Prelude> :t (- 1)
|
|
|
(- 1) :: (Num a) => a
|
|
|
Prelude> :t (1 -)
|
|
|
(1 -) :: (Num a) => a -> a
|
|
|
```
|
|
|
|
|
|
> >
|
|
|
> > If we removed special treatment of '-', then these become symmetrical again. However it seems unintuitive that `(-x)` is a right section of '-', but `(-1)` is the literal -1.
|
|
|
|
|
|
---
|
|
|
|
|
|
the unary '-' is a very odd case in the report and causes a lot of confusion.
|
|
|
|
|
|
Another motivation for lexing - as part of a numeric literal (or changing its precedence), from 2007-10-10 \#haskell:
|
|
|
|
|
|
```wiki
|
|
|
[09:33] < quicksilver> am I the only person who finds mod's behaviour with
|
|
|
negative numbers stupid
|
|
|
[09:34] < matthew-_> try rem then
|
|
|
[09:34] < quicksilver> > (-4) `mod` 16
|
|
|
[09:34] < quicksilver> > (-4) `rem` 16
|
|
|
[09:34] < lambdabot> 12
|
|
|
[09:34] < lambdabot> -4
|
|
|
[09:34] < quicksilver> that's odd, that's not what my ghci did
|
|
|
[09:34] < quicksilver> doh
|
|
|
[09:34] < quicksilver> bracketing error :P
|
|
|
[09:35] < quicksilver> mod does do what I expect, if I put the negative number
|
|
|
in bracets
|
|
|
[09:35] < quicksilver> I wouldn't expect 'unary minus' to have lower precedence
|
|
|
that `mod` though
|
|
|
[09:35] < sieni> > -4 `rem` 16
|
|
|
[09:35] < lambdabot> -4
|
|
|
[09:35] < sieni> oops
|
|
|
[09:35] < sieni> > -4 `mod` 16
|
|
|
[09:35] < lambdabot> -4
|
|
|
[09:35] < quicksilver> sieni: yeah, that's what I did
|
|
|
[09:36] < sieni> quicksilver: yeah I know, that has bitten me too :-)
|
|
|
[09:36] < quicksilver> I always expect unary minus to bind tight
|
|
|
[09:37] < osfameron> yeah, haskell's unary minus is surprisingly loose
|
|
|
```
|
|
|
|
|
|
---
|
|
|
to fix it we can
|
|
|
|
|
|
|
|
|
haskell-src-exts, haskell-src, and HLint have been using a unary minus that binds tighter than any other infix operator, and have never encountered any problems with it: [ http://www.haskell.org/pipermail/haskell-prime/2009-August/002955.html](http://www.haskell.org/pipermail/haskell-prime/2009-August/002955.html). |
|
|
- make - part of the lexical syntax of numbers. so a - followed by digits is interpreted as a negative number
|
|
|
- get rid of all other special treatment of -
|
|
|
- people can use 'negate' if they want to negate non literals. |