Использование <> в операторе assert в OCaml вызывает ошибку - PullRequest
1 голос
/ 31 января 2020

Так что это может быть глупым вопросом, но я столкнулся с ошибкой в ​​utop прямо сейчас, после того, как только начал использовать OCaml. Я пытаюсь утверждать, что два целых числа структурно не равны.

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

Весь оператор вызывает ошибку, но простой ввод правильного выражения приводит к значению true.

2 <> 3;;
- : bool = true

Я добавил скобки в исходное утверждение assert, и это решает проблему.

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

Мне просто интересно, что именно произошло без скобок, чтобы изначально вызвать ошибку. Когда вам обычно нужны скобки?

1 Ответ

4 голосов
/ 31 января 2020

Это проблема с приоритетом, которая определяет, насколько «охотно» применяется правило синтаксического анализа. assert имеет относительно высокий приоритет, выше <> и других операций. Это означает, что это выражение

assert 2 <> 3

анализируется как

(assert 2) <> 3

, а не как

assert (2 <> 3)

. Вы можете найти полную таблицу приоритетов здесь: https://caml.inria.fr/pub/docs/manual-ocaml/expr.html#sec133

...