Каковы официальные названия для инфиксных операторов? - PullRequest
0 голосов
/ 01 декабря 2018

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

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

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

1 Ответ

0 голосов
/ 01 декабря 2018

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

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 ниже для более подробного объяснения.

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

...