在 OCaml 的断言语句中使用 <> 会导致错误

Using <> in an assert statement in OCaml causes error

所以这可能是一个愚蠢的问题,但我 运行 在刚开始使用 OCaml 之后就在 utop 中遇到了一个错误。我试图断言两个整数在结构上不相等。

assert 2 <> 3;;
Error: This expression has type int but an expression was expected of type
   bool because it is in the condition of an assertion

整个语句会导致错误,但只需键入我断言正确的表达式,计算结果为真。

2 <> 3;;
- : bool = true

我在原始断言语句中添加了圆括号,这解决了问题。

assert (2 <> 3);;
- : unit = ()

我只是想知道没有括号到底发生了什么导致最初的错误。通常什么时候需要括号?

这是一个优先级问题,它决定了如何"eagerly" 应用解析规则。 assert的优先级比较高,高于<>等操作。这意味着这个表达式

assert 2 <> 3

被解析为

(assert 2) <> 3

而不是

assert (2 <> 3)

您可以在此处找到完整的 table 优先级:https://caml.inria.fr/pub/docs/manual-ocaml/expr.html#sec133