有像这样的代码
let () = print_string "something" in
fn
Run Code Online (Sandbox Code Playgroud)
在一些OCaml代码中.
这是什么意思?"()"有特殊含义吗?或者它的含义是否相同
print_string "something";
fn
Run Code Online (Sandbox Code Playgroud)
Jef*_*eld 14
()在这个let表达式中没有什么特别之处,它只是一种模式.所有let表情看起来都像.这里的模式总是匹配,因为返回,并且是该类型的唯一值.通过这种方式,当第一个表达式更多地是一个语句(返回)时,它只是将两个表达式组合成一个表达式的另一种方式.let pattern = expression in other-expressionprint_stringunit()unit
所以你是对的,构造与使用;运算符的含义几乎相同.唯一真正的区别在于优先权.例如,如果你写的话
if x < 3 then
print_string "something";
f x
Run Code Online (Sandbox Code Playgroud)
你会发现,f x是始终调用.优先级;太低,无法将第二个表达式拉到控制之下if.这就是很多人(包括我)养成使用习惯的原因let () = expression.如果你把上面的内容写成
if x < 3 then
let () = print_string "something"
in f x
Run Code Online (Sandbox Code Playgroud)
该f x时才称为x小于3,通常是我想要的.从本质上讲,优先级let要高得多;.
当然,可能有其他方法可以获得这种效果,但使用的好处let是你不必在代码中添加任何东西(如右括号或一个end).如果您要添加print_string作为调试语句,这是将更改保持在本地的一个方便的方便方法.