Я хочу, чтобы хорошие операторы для сложной арифметики сделали мой код более удобочитаемым. 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.}