Я хочу, чтобы хорошие операторы для сложной арифметики сделали мой код более удобочитаемым. 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.}
Спасибо! Меня раздражает то, что правильный ответ не более полезен и/или потрясающий. Я тоже недостаточно знаком с p4/p5, чтобы использовать его. – forefinger
Отличная ссылка (и). Я хотел бы упомянуть camlp {4,5}, но установление приоритета операторов было только средним в исходном вопросе. Конец должен был сделать код перспективным.Я сомневаюсь, что любое решение, связанное с camlp {4,5}, является хорошим решением для этой цели; это, безусловно, зависимость, которую я стараюсь избегать, хотя это часто заманчиво. –