我想要复杂算术的好运算符,以使我的代码更具可读性.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.}
dba*_*osa 13
通常,运算符的关联性和优先级(除非你转到camlp4或其他东西)是基于运算符的第一个字符.
source(查找"用户定义的运算符的关联性优先级").
有没有办法在OCaml中明确定义(见这也是"用户定义的中缀运算符" 比较客观CAML和标准ML)
您可以使用camlp4或camlp5明确定义中缀函数的顺序.似乎pa_do也可以是一个选项.
我试着写一个例子,但我不熟悉camlp4,几分钟内学习起来并不容易.