OCaml 中的“int/2”类型是什么

use*_*123 2 ocaml utop

当我在交互环境(OCamlutop)中执行以下命令时,所有“int”类型的表达式都变成了“int/2”类型。这种行为可以复制如下。

# 3;;
- : int = 3

# type int;;
type int

# type a;;
type a

# 3;;
- : int/2 = 3
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?谢谢!

2020 年 3 月 2 日编辑:

我发现如果我执行以下操作,“int/2”将不会出现。谁能解释一下这里发生了什么?

# 3;;
- : int = 3

# type int;;
type int

# 3;;
- : int = 3
Run Code Online (Sandbox Code Playgroud)

更新:以上情况使用了OCaml 4.08.1 版

Jef*_*eld 6

常量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
Run Code Online (Sandbox Code Playgroud)

(也有可能这种行为在 OCaml 4.10.0 中变得更加一致了。)

  • 范围是指定义某个名称的程序的文本部分。例如,在“let v = expr1 in expr2”中,“v”的范围是“expr2”。在 `expr2` 结束之后,`v` 不再被定义。类型标识符的范围从它出现的位置到模块的末尾(这包括其定义的主体,即递归使用)。 (2认同)