Подтвердить что ты не робот

OCaml: Почему я не могу использовать этот инфикс оператора?

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

let ( ~=~ ) a b = true

Если я попытаюсь использовать его infix:

if a ~=~ b then 1 else 2

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

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

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

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

4b9b3361

Ответ 1

В OCaml ли оператор infix или префикс определяется его первым символом. В вашем случае символ "~" предназначен для префикса: 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)