在OCaml中,當使用let
爲短路運營商(&&
或||
)分配別名時,它不再短路評估操作數。評估短路運營商的評估順序以及在OCaml中允許
這並不直觀。這種行爲的原因是什麼?
考慮下面的代碼:
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' *)
這也發生與let ... in
,所以let b = (&&) in b (f()) (g());;
還輸出gf
。
我從來沒有嘗試過-dlambda通過ocaml toplevel,很好。 – nlucaroni