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