“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)中使用下划线通配符有啥副作用吗?