我发现很难掌握 OCaml 中分号的用法。最初,我认为它是一系列表达式的分隔符。然而,尽管我只尝试连接两个常量表达式,但我还是收到了警告。为什么会有这样的警告?为什么要提供单位说明?
# 2; 3;;
Warning 10 [non-unit-statement]: this expression should have type unit.
- : int = 3
是的,
;
是用来分隔表达式的。但由于它不使用第一个值,它会更喜欢一个单位值:()
.
您可以输入
ignore 2;3
。或者也let _ = 2 in 3
。 (在这里,评估 2 并忘记它的值并不有趣,但其他表达式有副作用,两个建议之一可以得心应手)。
ignore
是 Stdlib
的函数,您可以用 let ignore _ = ()
声明
您可以使用
ocaml -w -10
或 ocaml -w -non-unit-statement
禁用此警告。
;
运算符丢弃它的左侧操作数。因此在
computation x; y
计算结果被丢弃。换句话说,如果计算没有任何副作用,
computation x; y
是一种效率较低且可读性较差的编写方式
y
相反,如果调用
computation x
的目的是计算修改一些全局状态而不是其他任何东西,那么 computation x
的返回类型将是 unit。并且丢弃单元总是好的,因为值()
不包含一位信息。
但是请注意,如果
computation x
确实修改了全局状态但返回结果状态,则忽略结果状态可能是编程错误。
如果computation
的预期用途是
match computation x with
| Ok () -> do_something ()
| Error msg -> Format.eprintf "@[Fatal error:@ %t@]@." msg; exit 2
写作
computation x; y
忘记处理错误情况。
因此,当
non-unit-statement
正在丢弃信息时,;
警告会通知您。 -strict-sequence
标志更进一步,使这个丢弃错误:
1; 2
Error: This expression has type int but an expression was expected of type
unit
because it is in the left-hand side of a sequence