Haskell Language
Объявления о фиксации
Поиск…
Синтаксис
- infix [integer] ops
- infixl [integer] ops
- infixr [integer] ops
параметры
| Компонент декларации | Имея в виду |
|---|---|
infixr | оператор является право-ассоциативным |
infixl | оператор лево-ассоциативный |
infix | оператор не является ассоциативным |
| необязательная цифра | приоритет привязки оператора (диапазон 0 ... 9, значение по умолчанию 9) |
op1, ... , opn | операторы |
замечания
Для анализа выражений, связанных с операторами и функциями, Haskell использует декларации четности, чтобы выяснить, куда идут скобки. Для этого
- обертывает функции приложения в parens
- использует привязку привязки для объединения групп терминов, разделенных операторами с одинаковым приоритетом
- использует ассоциативность этих операторов, чтобы выяснить, как добавить парны к этим группам
Заметим, что мы предполагаем здесь, что операторы в любой заданной группе из шага 2 должны иметь одну и ту же ассоциативность. Фактически, Haskell отклонит любую программу, где это условие не выполняется.
В качестве примера приведенного выше алгоритма мы можем шагнуть, хотя процесс добавления скобок к 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1 .
infixl 6 +
infixl 6 -
infixl 7 *
infixr 8 ^
-
1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1 -
1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1)) -
(1 + ((negate 5) * 2)) - (3 * (4 ^ (2 ^ 1)))
Более подробная информация содержится в разделе 4.4.2 отчета Haskell 98 .
Ассоциативность
infixl vs infixr vs infix описывает, на каких сторонах будут группироваться infixr . Например, рассмотрим следующие декларации определения (в базе)
infixl 6 -
infixr 5 :
infix 4 ==
infixl говорит нам, что - оставил ассоциативность, а это означает, что 1 - 2 - 3 - 4 анализируется как
((1 - 2) - 3) - 4
infixr говорит нам, что : имеет правую ассоциативность, а это означает, что 1 : 2 : 3 : [] анализируется как
1 : (2 : (3 : []))
infix сообщает нам, что == не может использоваться без нас, включая скобки, что означает, что True == False == True является синтаксической ошибкой. С другой стороны, True == (False == True) или (True == False) == True в порядке.
Операторы без явного объявления infixl 9 - это infixl 9 .
Приоритет привязки
Число, которое следует за информацией ассоциативности, описывает, в каком порядке применяются операторы. Он должен всегда находиться между 0 и 9 включительно. Это обычно называют тем, насколько тесно связан оператор. Например, рассмотрим следующие декларации определения (в базе)
infixl 6 +
infixl 7 *
Так как * имеет более высокий приоритет привязки, чем + мы читаем 1 * 2 + 3 как
(1 * 2) + 3
Короче говоря, чем выше число, тем ближе оператор «потянет» парнеров по обе стороны от него.
замечания
Функциональное приложение всегда привязывается выше операторов, поэтому
fx `op` gyдолжно интерпретироваться как(fx)op(gy)независимо от того, что оператор``op`и его объявление фиксации.Если приоритет привязки опускается в объявлении фиксации (например, мы имеем
infixl *!?), по умолчанию используется значение9.
Примеры объявлений
-
infixr 5 ++ -
infixl 4 <*>, <*, *>, <**> -
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR` -
infix 4 ==, /=, <, <=, >=, > -
infix ??