Мне нужны хорошие операторы для сложной арифметики, чтобы сделать мой код более читабельным. В Ocaml есть модуль Complex, поэтому я просто хочу добавить операторы, которые вызывают эти функции.
Самый интуитивный способ для меня - создать новый сложный оператор из всех обычных операторов, добавив '&' к символу оператора. Таким образом, + & и * & будет сложным сложением и умножением. Я также хотел бы, чтобы ~ & было комплексное сопряжение.
Если я собираюсь использовать эти операторы, я хочу, чтобы они ассоциировались так же, как обычные арифметические ассоциации. Основываясь на следующих сессиях, они автоматически ведут себя так, как я хочу, но я хотел бы понять, почему, чтобы я не получал ужасных ошибок, когда я вводил больше операторов.
Мое текущее предположение заключается в том, что их приоритет определяется лексической сортировкой символов оператора в соответствии с порядком, который соответствует нормальному арифметическому приоритету. Но я не могу это подтвердить.
Сессия первая:
# 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.}