在OCaml中的let命令中使用下划线通配符(即let=…in)有任何副作用吗?
在使用OCaml时,我几乎总是在在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绝对没有后果。编译器不会向
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的默认警告级别。只有在前面的短语以结尾时,这才有效代码>标记。