“let () =”在 Ocaml 中是啥意思?

Posted

技术标签:

【中文标题】“let () =”在 Ocaml 中是啥意思?【英文标题】:What does "let () = " mean in Ocaml?“let () =”在 Ocaml 中是什么意思? 【发布时间】:2011-11-23 09:08:12 【问题描述】:

有类似的代码

let () = print_string "something" in
fn

在一些 OCaml 代码中。

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

的意思一样
print_string "something";
fn

【问题讨论】:

您可能希望只使用let _ = ...,因为它适用于大多数(如果不是全部)表达式。 let _ = ...,或者脆弱的模式匹配,绝对不推荐。这几乎相当于对类型系统竖起中指。 我同意 nlucaroni。如果你想要let _ = ... in ...,那么你可能想要ignore (...); ... 【参考方案1】:

() 在这个 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

f x 仅在x 小于 3 时调用,这通常是我想要的。本质上,let 的优先级远高于;

当然还有其他方法可以达到这种效果,但使用let 的好处是您不必在以后在代码中添加任何内容(如右括号或end) .如果您要添加 print_string 作为调试语句,这是一种将更改保持在本地的便捷方式。

【讨论】:

作为语法允许的令人惊讶的程序的另一个例子,如果你只想在通常的算术定律成立时执行f(),你可以写let 4 = 2 + 2 in f() ;;【参考方案2】:

Jeffrey 的回答绝对正确,但还有一点:

如果你写

fx "something";
fn

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

let () = fx "something" in
fn

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

还有写的可能

let _ = fx "something" in
fn

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

【讨论】:

最后一个等价于ignore (fx "something"); fn,用分号表示

以上是关于“let () =”在 Ocaml 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在 OCaml 中分隔多个“let”声明,后跟一个“let in”表达式

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

OCaml - 如何在匹配表达式中放置一个 let 绑定?

用 let 重建 OCaml 模式

Ocaml中“type ...and”和“let ...and”之间的范围不一致

Lisp 的 let* 的 Ocaml 等价物?