6.9.1. Negative literals

NegativeLiterals
Since:7.8.1

Enable negative numeric literals.

The literal -123 is, according to Haskell98 and Haskell 2010, two tokens, a unary minus (-) and the number 123, and is desugared as negate (fromInteger 123). The language extension NegativeLiterals causes it to be treated as a single token and desugared as fromInteger (-123).

This can be useful when the positive and negative range of a numeric data type don’t match up. For example, in 8-bit arithmetic -128 is representable, but +128 is not. So negate (fromInteger 128) will elicit an unexpected integer-literal-overflow message.

Whitespace can be inserted, as in - 123, to force interpretation as two tokens.

In 9.0, the behavior of this extension changed, and now we require that a negative literal must not be preceded by a closing token (see GHC Proposal #229 for the definition of a closing token). In other words, we parse f -123 as f (-123), but x-123 as (-) x 123. Before this amendment, NegativeLiterals caused x-123 to be parsed as x(-123).

NegativeLiterals is a subset of LexicalNegation. That is, enabling both of those extensions has the same effect as enabling LexicalNegation alone.