Что такое тип int/2 в OCaml

Когда я выполнил следующие команды в среде взаимодействия (либо 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

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


person user12448123    schedule 21.02.2020    source источник


Ответы (1)


Константа 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.)

person Jeffrey Scofield    schedule 21.02.2020
comment
Благодарим Вас за разъяснения. Не могли бы вы объяснить, каков объем, о котором вы упомянули int? Также, пожалуйста, взгляните на мои правки, в этом добавленном случае, какова тогда область действия int? Почему есть разница, если я удалю команду type a;;? Спасибо! - person user12448123; 02.03.2020
comment
Область действия относится к текстовой части программы, в которой определено определенное имя. Например, в let v = expr1 in expr2 область действия v равна expr2. После окончания expr2 v больше не определяется. Область действия идентификатора типа простирается от того места, где он появляется, до конца модуля (включая тело его определения, т. е. рекурсивное использование). - person Jeffrey Scofield; 02.03.2020