Jac*_*ale 3 ocaml functional-programming
我正在学习Jason Hickey的Objective Caml简介.
只是有一个关于重新定义中缀运算符的问题.
所以在书中,有这样一段:
# let (+) = ( * )
and (-) = (+)
and ( * ) = (/)
and (/) = (-);;
val + : int > int > int = <fun>
val - : int > int > int = <fun>
val * : int > int > int = <fun>
val / : int > int > int = <fun>
# 5 + 4 / 1;;
-: **int = 15**
Run Code Online (Sandbox Code Playgroud)
首先,这些重新定义如何运作?
对我来说,似乎函数在一种无限循环中运行,因为所有操作似乎都被重新定义和连接.
例如,如果我这样做1+2,那么这将是1 * 2和因为( * ) = (/),这将是那么1 / 2既然(/) = (-),那么这将是1-2,如此类推.我对吗?
其次,将结果5 + 4 / 1是15,即使该功能在重新定义只执行一个步骤进一步?
因此,假设重新定义将进一步执行,即,1 + 2只会进行1 * 2并且不再进行转换,所以5 + 4 / 1应该是5 * 4 -1,对吧?然后答案是19.我对么?
对我来说,似乎函数在一种无限循环中运行,因为所有操作似乎都被重新定义和连接.
不是真的,它只是同时重新定义中缀运算符(使用and关键字).你看到的不是递归定义.在OCaml中,使用let rec(您可能已经知道)进行递归定义.
对于问题的第二部分,我认为这是运营商优先权的问题.请注意,在原始表达式5 + 4 / 1中实际上5 + (4/1)遵循算术运算符的通常优先级规则.所以,我认为转换只是保留了这种绑定(有点).你得到了5 * (4 - 1) = 15.