在 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
所以这可能是一个愚蠢的问题,但我 运行 在刚开始使用 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