Как Ocaml решает приоритет для пользовательских операторов?

Я хочу, чтобы хорошие операторы для сложной арифметики сделали мой код более читаемым. Ocaml имеет Сложный модуль, таким образом, я просто хочу добавить операторы, которые вызывают те функции.

Самый интуитивный путь ко мне состоит в том, чтобы сделать новый сложный оператор изо всех обычных операторов путем добавления '&' к символу оператора. Таким образом + и и *& будет сложное дополнение и умножение. Я также хотел бы ~ и быть сложным спряжением.

Если я собираюсь использовать эти операторы, я хочу, чтобы они связали тот же способ, которым связывается нормальная арифметика. На основе следующих сессий они автоматически ведут себя способ, которым я хочу, но я хотел бы понять, почему, так, чтобы я не получал ужасные ошибки, когда я представляю больше операторов.

Мое текущее предположение - то, что их приоритет сделан путем лексической сортировки символов оператора согласно упорядочиванию, которое согласовывается с нормальным арифметическим приоритетом. Но я не могу подтвердить это.

Сессия один:

# open Complex;;
# let (+&) a b = add a b;;
val ( +& ) : Complex.t -> Complex.t -> Complex.t = <fun>
# let ( *&) a b = mul a b;;
val ( *& ) : Complex.t -> Complex.t -> Complex.t = <fun>
# one +& zero *& one +& zero *& one;;
- : Complex.t = {re = 1.; im = 0.}
# zero +& one *& zero +& one *& zero;;
- : Complex.t = {re = 0.; im = 0.}
# i +& i *& i +& i *& i *& i;;
- : Complex.t = {re = -1.; im = 0.}

Сессия два:

# open Complex;;
# let ( *&) a b = mul a b;;
val ( *& ) : Complex.t -> Complex.t -> Complex.t = <fun>
# let (+&) a b = add a b;;
val ( +& ) : Complex.t -> Complex.t -> Complex.t = <fun>
# one +& zero *& one +& zero *& one;;
- : Complex.t = {re = 1.; im = 0.}
# zero +& one *& zero +& one *& zero;;
- : Complex.t = {re = 0.; im = 0.}
# i +& i *& i +& i *& i *& i;;
- : Complex.t = {re = -1.; im = 0.}
# let (~&) a = conj a;;
val ( ~& ) : Complex.t -> Complex.t = <fun>
# (one +& i) *& ~& (one +& i);;
- : Complex.t = {re = 2.; im = 0.}
11
задан forefinger 5 June 2010 в 20:31
поделиться

2 ответа

В общем, ассоциативность и приоритет оператора (если вы не используете camlp4 или что-то в этом роде) основан на первом символе оператора.

источник (ищите «Приоритет ассоциативности для определяемого пользователем оператора»).

В OCaml нет способа явно определить его (см. this , а также «Пользовательские инфиксные операторы» на Сравнение Objective Caml и Standard ML )

Вы можете используйте camlp4 или camlp5 , чтобы явно определить порядок инфиксной функции. Похоже, pa_do также может быть вариантом.

Я попытался написать пример, но я не знаком с camlp4, и его нелегко выучить за несколько минут.

13
ответ дан 3 December 2019 в 02:52
поделиться

Это прямо в руководстве OCaml, раздел 6.7, прокрутите вниз, прямо перед разделом 6.7.1. В таблице старшинства есть такие вещи, как +... , которые включают любые пользовательские определения, начинающиеся с +. Неверно, что это всегда зависит от первого символа, так как **... имеет более высокий приоритет, чем *... .

14
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

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