Каковы официальные названия для инфиксных операторов?

Кажется, что существует ряд символов, которые могут действовать как инфиксные операторы; например

  • Интс: (+), (-), (*), (/), mod
  • поплавки: (+.), (-.), (*.), (/.)
  • Сравнение: (=), (<>), (<), (<=), (>), (>=)
  • функции: (|>), (<<), (>>)
  • монады: (>>=), (>>|)
  • списки: (::), (@)
  • разное: (^), (^/), (^:)

Что определяет, может ли функция действовать как инфиксный оператор или нет?

1 ответ

Решение

Это определяется первым символом оператора. Из руководства:

infix-symbol    ::= (= ∣  < ∣  > ∣  @ ∣  ^ ∣  | ∣  & ∣  + ∣  - ∣  * ∣  / ∣  $ ∣  %) { operator-char }  
    ∣    # { operator-char }+  

prefix-symbol   ::= ! { operator-char }  
    ∣    (? ∣  ~) { operator-char }+  

operator-char   ::= ! ∣  $ ∣  % ∣  & ∣  * ∣  + ∣  - ∣  . ∣  / ∣  : ∣  < ∣  = ∣  > ∣  ? ∣  @ ∣  ^ ∣  | ∣  ~

Так, например, пользовательский оператор определен так:

let (@?) a b = ...

Будет считаться инфиксным оператором, поскольку он начинается с @, в то время как

let (?@) a b = ...

является префиксным оператором, потому что он начинается с ?,

Есть некоторые дополнения и исключения к этому, однако, описанные в руководстве здесь:

  • mod, land, lor, lxor, lsl, lsr а также asr ключевые слова рассматриваются как инфиксные операторы (например, 2 mod 4).

  • - а также -. может интерпретироваться как инфиксные или префиксные операторы. Когда префикс thay переводится на ~- а также ~-. соответственно.

  • && а также || также рассматриваются специально, по причинам. Посмотрите комментарии @octachron ниже для более подробного объяснения.

Наконец, вы также можете рассмотреть приоритет и ассоциативность, которые перечислены в таблице в верхней части, перед первым разделом здесь

Другие вопросы по тегам