Quiero buenos operadores para la aritmética compleja para hacer que mi código sea más legible. Ocaml tiene un módulo complejo, así que solo quiero agregar operadores que llamen esas funciones.¿Cómo decide Ocaml la precedencia para los operadores definidos por el usuario?
La manera más intuitiva para mí es hacer un nuevo operador complejo de todos los operadores habituales agregando '&' al símbolo del operador. Por lo tanto + & y * & serán una adición y multiplicación complejas. También me gustaría que ~ & sea una conjugación compleja.
Si voy a utilizar estos operadores, quiero que se asocien de la misma manera que la aritmética normal se asocia. En base a las siguientes sesiones, se comportan automáticamente de la manera que yo quiero, pero me gustaría entender por qué, para no tener errores horribles cuando presento más operadores.
Mi conjetura actual es que su precedencia se hace ordenando léxicamente los símbolos del operador de acuerdo con un orden que sea consistente con la precedencia aritmética normal. Pero no puedo confirmar esto.
Sesión uno:
# 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.}
Sesión dos:
# 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.}
Gracias! Me molesta un poco que la respuesta correcta no sea más útil y/o sorprendente. Yo tampoco estoy lo suficientemente familiarizado con p4/p5 para usarlo. – forefinger
Great link (s). Iba a mencionar camlp {4,5}, pero fijar la precedencia de los operadores fue solo un medio en la pregunta original. El final fue hacer que el código fuera a prueba del futuro.Dudo que cualquier solución que involucre camlp {4,5} sea una buena solución para este objetivo; sin duda es una dependencia que trato de evitar, aunque a menudo es tentador. –