10

有类似的代码

let () = print_string "something" in
fn

在一些 OCaml 代码中。

这是什么意思?“()”有特殊含义吗?还是和这个意思一样

print_string "something";
fn
4

2 回答 2

14

()这个表达式没有什么特别之处let,它只是一个模式。所有let表达式看起来像。在这里,模式将始终匹配,因为返回, 并且是该类型的唯一值。这样,当第一个表达式实际上更像是一个语句(返回)时,它只是将两个表达式组合成一个的另一种方式。let pattern = expression in other-expressionprint_stringunit()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作为调试语句,这是将更改保持在一个位置的便捷方法。

于 2011-09-23T06:22:07.590 回答
3

杰弗里的回答是绝对正确的,但还有一点:

如果你写

fx "something";
fn

你搞砸了fx "something"编译器的结果类型会发出一个警告,这可能会在编译过程中丢失。另一方面,如果你写:

let () = fx "something" in
fn

编译器将类型检查结果是否fx "something"可以匹配(),即它确实是类型unit。因此,如果你搞砸了,就会产生错误,这通常更安全。

还有写的可能

let _ = fx "something" in
fn

这只会获得 Jeffrey 提到的优先效果,但不会进行任何类型检查,因为_可以匹配任何类型的值。

于 2011-09-23T09:07:16.137 回答