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

在OCaml中的let命令中使用下划线通配符(即let=…in)有任何副作用吗?,ocaml,let,Ocaml,Let,在使用OCaml时,我几乎总是在let=exp中使用下划线通配符,特别是当exp的结果不重要,但其内部的计算很重要时。例如: let _ = print_endline "abc" in ... let _ = a := !a + 1 in ... let _ = do_some_thing ... in 让u=打印u结尾行“abc” ... 让=a:=!a+1英寸 ... 让我们做点什么。。。在里面 所以,我只是想知道广泛使用let是否有任何副作用?不,广泛使用let绝对没有后果。编译器不会向

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

let _ = print_endline "abc" in ... let _ = a := !a + 1 in ... let _ = do_some_thing ... in 让u=打印u结尾行“abc” ... 让=a:=!a+1英寸 ... 让我们做点什么。。。在里面
所以,我只是想知道广泛使用
let
是否有任何副作用?

不,广泛使用
let
绝对没有后果。编译器不会向全局环境添加名称,因为您没有提供名称。

其副作用是在以后的软件中跟踪恼人的bug。
let=
的问题在于,它会默默地忽略您希望成为总数的部分应用程序。假设您编写以下内容:

let f a b = ...
let _ = f 3 4
将来,您将在
f
中添加一个参数:

let f a b c = ...
表达式
let f3=4
仍将以静默方式编译,并且您的程序将不会调用该函数,这让您想知道发生了什么。如果需要忽略非单位结果,则最好始终允许使用
()
,并使用
忽略

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

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

let的目的是将值绑定到标识符。如果你只做副作用,最好用
begin。。结束
块。就你而言:

开始
打印尾行“abc”;
a:=!a+1;
做点什么吧;
结束

其副作用是让人讨厌的bug,将来要在您的软件中进行跟踪。我举双手赞成。如果明确禁止编译器对类型执行任何有用的操作,那么使用强类型语言有什么意义,就像使用
let=…
序列那样?它不会被默默忽略:会打印警告5。不会使用OCaml的默认警告级别。只有在前面的短语以
结尾时,这才有效标记。