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

时间:2015-03-14 11:27:47

标签: ocaml let

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

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

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

3 个答案:

答案 0 :(得分:10)

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

let f a b = ...
let _ = f 3 4

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

let f a b c = ...

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

let () = ignore (f 3 4)
let () = print_endline "abc"

使用let _ = ...应被视为不良风格。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

let的目的是将值绑定到标识符。如果你只是做副作用,最好将它包装在begin .. end块中。在你的情况下:

begin
    print_endline "abc";
    a := !a + 1;
    do_some_thing ();
end