OCaml: Почему я не могу использовать этот операторский инфикс? - PullRequest
22 голосов
/ 27 мая 2011

Я определил пользовательский оператор равенства (определение не очень важно, поэтому я буду вставлять пустышки):

let ( ~=~ ) a b = true

Если я попытаюсь использовать инфикс:

if a ~=~ b then 1 else 2

Я получаю следующую ошибку: This expression is not a function; it cannot be applied.

Я могу исправить это, переименовав оператора из ~=~ в =~ или вызвав его как функцию: if (~=~) a b then 1 else 2.

Кажется, это общая проблема с операторами, которые начинаются с ~. У меня вопрос, почему я не могу использовать такие операторы инфикс? Что-нибудь особенное в символе ~?

Примечание: я уже просмотрел документацию, но не смог найти ничего подходящего. Может я что то пропустил?

Ответы [ 2 ]

49 голосов
/ 27 мая 2011

В OCaml, является ли оператор инфиксным или префиксным, определяется его первым символом. В вашем случае символ '~' предназначен для префикса: с помощью let (~ = ~) a b = ... вы определяете префиксный оператор. ~ = ~ a является допустимым выражением и возвращает функцию.

Помимо инфикса или префикса, ассоциативность инфиксного оператора (левый или правый) и приоритет оператора (какой из + и * имеет больший?) Синтаксически определяются первым символом оператора.

Это звучит некрасиво, поскольку вы не можете контролировать характеристики ваших причудливых операторов, но это облегчает чтение исходного кода OCaml кем-то другим со множеством странных пользовательских операторов.

Вот таблица символов для операторов:

The first char   :  prefix/infix/connectivity power/left-or-right
! ~ ?            :  prefix
= < > | & $      :  infix0, left
@ ^              :  infix1, right
+ -              :  infix2, left
* /              :  infix3, left  ( ** is exceptional. It is right assoc and have power 4)
7 голосов
/ 27 мая 2011

По лексическим соглашениям ocaml ~ зарезервировано для префиксных операторов, см. http://caml.inria.fr/pub/docs/manual-ocaml/lex.html#infix-symbol

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...