在OCaml中使用let命令(即让_ = ... in)中使用下划线通配符的任何副作用?

Tru*_* Ta 5 ocaml let

当使用OCaml时,我几乎总是使用下划线通配符let _ = exp,特别是当结果exp不重要时,但其中的计算是.例如:

let _ = print_endline "abc" in
...
let _ = a := !a + 1 in
...
let _ = do_some_thing ... in

所以,我只是想知道是否有广泛使用的副作用let _ = ...

Dan*_*zli 10

副作用是将来在您的软件中跟踪的烦恼.问题let _ =是它会默默地忽略你想要的部分应用程序.假设您编写以下内容:

let f a b = ...
let _ = f 3 4
Run Code Online (Sandbox Code Playgroud)

并且在将来你添加一个参数f:

let f a b c = ...
Run Code Online (Sandbox Code Playgroud)

表达式let _ = f 3 4仍将静默编译,您的程序将不会调用该函数,让您想知道发生了什么.如果你需要忽略非单位结果,总是让()并使用它会好得多ignore:

let () = ignore (f 3 4)
let () = print_endline "abc"
Run Code Online (Sandbox Code Playgroud)

使用let _ = ...应该被认为是不好的风格.

  • 不是OCaml的默认警告级别. (2认同)

Pas*_*uoq 1

不,广泛使用绝对没有任何后果let _ =。编译器不会向全局环境添加名称,因为您没有给出名称。