gpt4 book ai didi

ocaml - 短路运算符的评估顺序并让 OCaml

转载 作者:行者123 更新时间:2023-12-01 08:23:33 25 4
gpt4 key购买 nike

在 OCaml 中,当使用 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' *)

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>

lambda 格式没有记录,但应该很清楚 eta 扩展正在发生。

关于ocaml - 短路运算符的评估顺序并让 OCaml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23833221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com