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

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

let ( ~=~ ) a b = true

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

if a ~=~ b then 1 else 2

, я получу следующую ошибку: Это выражение не является функцией; его нельзя применить .

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

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

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

23
задан nlucaroni 30 October 2014 в 16:36
поделиться

1 ответ

В 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)
51
ответ дан 29 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: