有类似的代码
let () = print_string "something" in
fn
在一些 OCaml 代码中。
这是什么意思?“()”有特殊含义吗?还是和这个意思一样
print_string "something";
fn
()
这个表达式没有什么特别之处let
,它只是一个模式。所有let
表达式看起来像。在这里,模式将始终匹配,因为返回, 并且是该类型的唯一值。这样,当第一个表达式实际上更像是一个语句(返回)时,它只是将两个表达式组合成一个的另一种方式。let
pattern
=
expression
in
other-expression
print_string
unit
()
unit
所以你是对的,该构造与使用运算符的含义几乎相同;
。唯一真正的区别在于优先级。例如,如果你写
if x < 3 then
print_string "something";
f x
你会发现它f x
总是被调用。的优先级;
太低,无法将第二个表达式拉到 的控制之下if
。这就是很多人(包括我)养成使用let () =
expression
. 如果你把上面写成
if x < 3 then
let () = print_string "something"
in f x
只有在小于 3f x
时才调用,这通常是我想要的。x
本质上, 的优先级let
远高于;
。
当然,还有其他方法可以达到这种效果,但使用的好处let
是您不必稍后在代码中添加任何内容(如右括号或end
)。如果您要添加print_string
作为调试语句,这是将更改保持在一个位置的便捷方法。
杰弗里的回答是绝对正确的,但还有一点:
如果你写
fx "something";
fn
你搞砸了fx "something"
编译器的结果类型会发出一个警告,这可能会在编译过程中丢失。另一方面,如果你写:
let () = fx "something" in
fn
编译器将类型检查结果是否fx "something"
可以匹配()
,即它确实是类型unit
。因此,如果你搞砸了,就会产生错误,这通常更安全。
还有写的可能
let _ = fx "something" in
fn
这只会获得 Jeffrey 提到的优先效果,但不会进行任何类型检查,因为_
可以匹配任何类型的值。