Поиск…


Синтаксис

  1. infix [integer] ops
  2. infixl [integer] ops
  3. infixr [integer] ops

параметры

Компонент декларации Имея в виду
infixr оператор является право-ассоциативным
infixl оператор лево-ассоциативный
infix оператор не является ассоциативным
необязательная цифра приоритет привязки оператора (диапазон 0 ... 9, значение по умолчанию 9)
op1, ... , opn операторы

замечания

Для анализа выражений, связанных с операторами и функциями, Haskell использует декларации четности, чтобы выяснить, куда идут скобки. Для этого

  1. обертывает функции приложения в parens
  2. использует привязку привязки для объединения групп терминов, разделенных операторами с одинаковым приоритетом
  3. использует ассоциативность этих операторов, чтобы выяснить, как добавить парны к этим группам

Заметим, что мы предполагаем здесь, что операторы в любой заданной группе из шага 2 должны иметь одну и ту же ассоциативность. Фактически, Haskell отклонит любую программу, где это условие не выполняется.

В качестве примера приведенного выше алгоритма мы можем шагнуть, хотя процесс добавления скобок к 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1 .

infixl 6 +
infixl 6 -
infixl 7 *
infixr 8 ^
  1. 1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
  2. 1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
  3. (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 ??


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow