为什么“2;3;;”提出警告,我应该提供单位声明?

问题描述 投票:0回答:2

我发现很难掌握 OCaml 中分号的用法。最初,我认为它是一系列表达式的分隔符。然而,尽管我只尝试连接两个常量表达式,但我还是收到了警告。为什么会有这样的警告?为什么要提供单位说明?

# 2; 3;;
Warning 10 [non-unit-statement]: this expression should have type unit.
- : int = 3
ocaml
2个回答
0
投票

是的,

;
是用来分隔表达式的。但由于它不使用第一个值,它会更喜欢一个单位值:
()
.

您可以输入

ignore 2;3
。或者也
let _ = 2 in 3
。 (在这里,评估 2 并忘记它的值并不有趣,但其他表达式有副作用,两个建议之一可以得心应手)。

ignore
Stdlib
的函数,您可以用
let ignore _ = ()

声明

您可以使用

ocaml -w -10
ocaml -w -non-unit-statement
禁用此警告。


0
投票

;
运算符丢弃它的左侧操作数。因此在

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
© www.soinside.com 2019 - 2024. All rights reserved.