ano*_*nol 2 ocaml operator-precedence
在OCaml中,当使用a let为短路运算符(&&或||)分配别名时,它不再使操作数的评估短路.
这不直观.这种行为的原因是什么?
请考虑以下代码:
let f() = Printf.printf "f"; false;;
let g() = Printf.printf "g"; true;;
let a = (&&);;
f() && g();; (* outputs 'f' *)
(&&) (f()) (g());; (* outputs 'f' *)
a (f()) (g());; (* outputs 'gf' *)
Run Code Online (Sandbox Code Playgroud)
这也发生在let ... in,let b = (&&) in b (f()) (g());;也是输出gf.
这是因为它&&是一个原始运算符,其语义与普通函数完全不同.事实上,(&&)或多或少相当于fun x y -> x && y,正如nlucaroni所解释的那样,在它们被应用之前将评估它的论点(以未指定的顺序,通常是从右到左,但你不应该依赖它).
你可以通过使用来看到ocaml -dlambda.这将启动一个解释器,它以您输入的每个命令的一种中间语言输出翻译.然后,您将得到以下结果:
# (&&);;
(function prim/1044 prim/1043 (&& prim/1044 prim/1043))
- : bool -> bool -> bool = <fun>
Run Code Online (Sandbox Code Playgroud)
该lambda格式没有记载,但它应该是再清楚不过的是ETA膨胀正在发生的事情.
| 归档时间: |
|
| 查看次数: |
1012 次 |
| 最近记录: |