Я определил собственный оператор равенства (определение не очень важно, поэтому я вставлю пустышку прочее):
let ( ~=~ ) a b = true
Если я попытаюсь использовать инфикс:
if a ~=~ b then 1 else 2
, я получу следующую ошибку: Это выражение не является функцией; его нельзя применить
.
Я могу исправить это, переименовав оператор из ~ = ~
в = ~
, либо вызвав его как функцию: if (~ = ~) ab then 1 else 2
.
Похоже, что это общая проблема с операторами, которые начинаются с ~
.
У меня вопрос, почему я не могу использовать такие инфиксные операторы? Есть ли что-нибудь особенное в символе ~
?
Примечание: я уже просмотрел документацию, но не нашел ничего подходящего. Может, я что-то пропустил?
В 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)