未使用的变量vs let()和let _



假设我有一堆嵌套的Let。。。在声明中。我注意到如果我有

(* 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是一种具有副作用的严格评估(更具体地说,按值调用(语言,这意味着它将按顺序评估表达式,而不会优化具有潜在副作用的代码。

最新更新