-
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.