-
NegativeLiterals -
- Начиная с:
-
7.8.1
Включает отрицательные числовые литералы.
Литерал -123, согласно Haskell98 и Haskell 2010, состоит из двух токенов: унарного минуса (-) и числа 123; он десахаризуется в negate (fromInteger 123). Расширение языка NegativeLiterals приводит к тому, что он рассматривается как один токен и десахаризуется в fromInteger (-123).
Это может быть полезно, если положительный и отрицательный диапазоны числового типа данных не совпадают. Например, в 8-битной арифметике -128 представимо, а +128 — нет. Поэтому negate (fromInteger 128) вызовет неожиданное сообщение о переполнении целочисленного литерала.
Чтобы принудительно интерпретировать запись как два токена, можно добавить пробел, например в - 123.
В версии 9.0 поведение этого расширения изменилось: теперь мы требуем, чтобы перед отрицательным литералом не стоял закрывающий токен (определение закрывающего токена см. в предложении GHC № 229). Иными словами, мы разбираем f -123 как f (-123), а x-123 — как (-) x
123. До этого изменения NegativeLiterals приводило к тому, что x-123 разбиралось как x(-123).
NegativeLiterals является подмножеством LexicalNegation. Иными словами, включение обоих этих расширений даёт тот же результат, что и включение только LexicalNegation.