Spec-Zone.ru › Haskell 9

6.2.20. Лексическое отрицание

LexicalNegation
Since:

9.0.1

Определяет, является ли знак минус оператором отрицания во время лексического анализа, проверяя наличие окружающих пробелов.

В Haskell 2010, знак минус обозначает отрицание, если у него нет левого операнда. Рассмотрим x = - 5 и y = 2 - 5. В x, нет выражения между = и -, поэтому минус обозначает отрицание, в то время как в y, слева от минуса есть 2, поэтому он обозначает вычитание.

Это приводит к определённым синтаксическим аномалиям:

  • (% x) является секцией оператора для любого оператора (%) за исключением (-). (- x) отрицает x вместо правой секции оператора вычитания. Поэтому написать такую секцию невозможно, и пользователям рекомендуется использовать (subtract x).
  • Отрицательные числа должны быть заключены в скобки, когда они появляются в позиции аргумента функции. f (-5) верно, в то время как f -5 парсится как (-) f 5.

Последняя проблема частично решается с помощью NegativeLiterals. Когда она включена, -5 парсится как отрицательное 5 независимо от контекста, поэтому f -5 работает как ожидается. Однако это применяется только к литералам, поэтому f -x или f -(a*2) всё ещё парсятся как вычитание.

С LexicalNegation, обе аномалии разрешаются:

  • (% x) является секцией оператора для любого оператора (%), без исключений, если между % и x есть пробелы.
  • В f -x, -x парсится как отрицание x для любого синтаксически атомного выражения x (переменной, литерала или выражения в скобках).
  • Префикс - связывает сильнее, чем любой инфиксный оператор. -a % b парсится как (-a) % b независимо от фиктивности %.

Это означает, что (- x) является правой секцией оператора вычитания, а (-x) — отрицанием x. Обратите внимание, что у этих выражений часто разные типы ((- x) может иметь тип Int -> Int, а (-x) — тип Int), и поэтому пользователи, ошибочно приняв одно за другое, вероятно, получат ошибку компиляции.

При использовании LexicalNegation, отрицаемые литералы десугариваются без negate. То есть, -123 обозначает fromInteger (-123) вместо negate (fromInteger 123). Это делает LexicalNegation допустимой заменой для NegativeLiterals.

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/exts/lexical_negation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API