Ich möchte nette Operatoren für komplexe Arithmetik haben, um meinen Code übersichtlicher zu gestalten. Ocaml hat ein Complex-Modul, daher möchte ich einfach Operatoren hinzufügen, die diese Funktionen aufrufen.
Der intuitivste Weg für mich ist es, einen neuen komplexen Operator aus allen üblichen Operatoren zu erstellen, indem ich '&' an das Operator-Symbol anhänge. So werden +& und *& komplexe Addition und Multiplikation sein. Ich möchte auch ~& als komplexe Konjugation haben.
Wenn ich diese Operatoren verwenden werde, möchte ich, dass sie sich genauso wie normale Arithmetik verbinden. Basierend auf den folgenden Sitzungen, verhalten sie sich automatisch so, wie ich möchte, aber ich würde gerne verstehen, warum, damit ich keine schrecklichen Fehler bekomme, wenn ich weitere Operatoren einführe.
Meine derzeitige Vermutung ist, dass ihre Präzedenz durch das lexikalische Sortieren der Operator-Symbole gemäß einer Ordnung erfolgt, die mit der Präzedenz der normalen Arithmetik konsistent ist. Aber ich kann das nicht bestätigen.
Sitzung eins:
# open Complex;;
# let (+&) a b = add a b;;
val ( +& ) : Complex.t -> Complex.t -> Complex.t =
# let ( *&) a b = mul a b;;
val ( *& ) : Complex.t -> Complex.t -> Complex.t =
# 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.}
Sitzung zwei:
# open Complex;;
# let ( *&) a b = mul a b;;
val ( *& ) : Complex.t -> Complex.t -> Complex.t =
# let (+&) a b = add a b;;
val ( +& ) : Complex.t -> Complex.t -> Complex.t =
# 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 =
# (one +& i) *& ~& (one +& i);;
- : Complex.t = {re = 2.; im = 0.}