未使用的变量 vs let() 和 let_?

Unused variable vs let () and let _?

假设我有一堆嵌套的 let...in 语句。我注意到如果我有

(* a bunch of let... in above *)
let test = expr1 in
(* a bunch of let ... in below *)

我得到这个 Error (warning 26): unused variable test,但是当我将它更改为 let _ = expr1 in ...let () = expr1 in ... 时没有错误消息。

我知道 let _ = 是任何类型的模式匹配,let () = 是任何单位类型的模式匹配,但这是否意味着我的 expr1 只是在任何地方执行?是否被调用一次?

你可以做一个非常简单的实验来测试这个:

let test = print_endline "named";;
let _ = print_endline "any pattern";;
let () = print_endline "unit";;

如您所见,无论是将其放入源文件并编译还是 运行 在顶层,它都会只打印一次每个字符串。

OCaml 是一种具有副作用的严格求值(更具体地说,按值调用)语言,这意味着它将按顺序求值表达式,而不是优化带有潜在副作用的代码。