【发布时间】:2015-05-16 21:17:19
【问题描述】:
在使用 OCaml 时,我几乎总是在 let _ = exp 中使用下划线通配符,尤其是当 exp 的结果并不重要,但其中的计算很重要时。例如:
所以,我只是想知道广泛使用let _ = ... 是否有任何副作用?
【问题讨论】:
在使用 OCaml 时,我几乎总是在 let _ = exp 中使用下划线通配符,尤其是当 exp 的结果并不重要,但其中的计算很重要时。例如:
所以,我只是想知道广泛使用let _ = ... 是否有任何副作用?
【问题讨论】:
副作用是将来在您的软件中跟踪令人讨厌的错误。 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 _ = ... 应该被认为是不好的风格。
【讨论】:
let _ = … 序列那样明确地阻止编译器对类型做任何有用的事情,那么使用强类型语言有什么意义?
不,广泛使用let _ = 绝对没有任何后果。编译器不会为全局环境添加名称,因为您没有提供名称。
【讨论】:
let 的目的是将值绑定到标识符。如果您只做副作用,最好将其包装在 begin .. end 块中。在你的情况下:
begin
print_endline "abc";
a := !a + 1;
do_some_thing ();
end
【讨论】:
;; 标记终止时才有效。