Что такое тип "int / 2" в OCaml - PullRequest
2 голосов
/ 21 февраля 2020

Когда я выполнял следующие команды в среде взаимодействия (либо OCaml, либо utop), все выражения типа "int" оказались типа "int / 2". Это поведение может быть воспроизведено следующим образом.

# 3;;
- : int = 3

# type int;;
type int

# type a;;
type a

# 3;;
- : int/2 = 3

Кто-нибудь знает, почему это происходит? Спасибо!

Редактировать 2 марта 2020:

Я обнаружил, что «int / 2» не появится, если я сделаю следующее. Может кто-нибудь объяснить, что здесь произошло?

# 3;;
- : int = 3

# type int;;
type int

# 3;;
- : int = 3

Обновление: в вышеуказанных случаях использовалась версия 4.08.1 OCaml.

1 Ответ

6 голосов
/ 21 февраля 2020

Константа 3 имеет встроенный тип int, который не относится к типу int, который находится в области видимости. Таким образом, верхний уровень добавляет число, чтобы обозначить этот факт. В противном случае все может стать очень запутанным. Т.е. вы можете получить сообщения типа «ожидалось значение типа int, но это значение типа int». С тегом /n он более четко говорит: «ожидалось значение типа int / n (один тип int), но это значение типа int / m (другой тип int)»

Похоже, это поведение было добавлено в OCaml 4.08.0. Вы можете найти обсуждение этой функции здесь: https://github.com/ocaml/ocaml/pull/1120

Обновление

Вы должны показать свою версию OCaml. Эта функция была добавлена ​​достаточно недавно, так что вы можете встретить уровни выше как с этой функцией, так и без нее.

В любом случае, оба ваших примера используют нотацию int/n в моих тестах с использованием OCaml 4.10.0

$ ocaml
        OCaml version 4.10.0
# 3;;
- : int = 3
# type int;;
type int
# type a;;
type a
# 3;;
- : int/2 = 3

$ ocaml
        OCaml version 4.10.0
# 3;;
- : int = 3
# type int;;
type int
# 3;;
- : int/2 = 3

(Возможно также, что это поведение стало более согласованным в OCaml 4.10.0.)

...