Ocaml如何确定用户定义运算符的优先级?

for*_*ger 11 ocaml

我想要复杂算术的好运算符,以使我的代码更具可读性.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.}
Run Code Online (Sandbox Code Playgroud)

第二节:

# 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.}
Run Code Online (Sandbox Code Playgroud)

new*_*cct 14

在OCaml手册第6.7节中,向下滚动,就在第6.7.1节之前.优先表有一些类似的东西+...,包括任何用户定义的起点+.它总是取决于第一个角色,因为**...它的优先级高于*....


dba*_*osa 13

通常,运算符的关联性和优先级(除非你转到camlp4或其他东西)是基于运算符的第一个字符.

source(查找"用户定义的运算符的关联性优先级").

有没有办法在OCaml中明确定义(见也是"用户定义的中缀运算符" 比较客观CAML和标准ML)

您可以使用camlp4camlp5明确定义中缀函数的顺序.似乎pa_do也可以是一个选项.

我试着写一个例子,但我不熟悉camlp4,几分钟内学习起来并不容易.

  • 很棒的链接.我要提到camlp {4,5},但修正运算符的优先级只是原始问题的一个意思.最终的目的是使代码面向未来.我怀疑任何涉及camlp {4,5}的解决方案都是实现这一目标的良好解决方案; 它肯定是我试图避免的依赖,虽然它经常是诱人的. (2认同)