Ocaml 中的打字和 `nonrec`

Typing and `nonrec` in Ocaml

我有一个很费解的例子,就是下面那个“ok”,我完全没看懂。

module File1_intf = struct
  type type1 = { nat : int }

  module type Intf = sig
    type nonrec type1 = type1
  end
end

module File1 : File1_intf.Intf = struct
  include File1_intf
end

module File3 = struct
  open File1

  let ok : type1 -> type1 = fun { nat } -> { nat = 0 }
  let ko { nat (*Unbound record field nat*) } = { nat = 0 }
end

我期待“未绑定记录字段”,但我想知道为什么添加类型修饰会将字段“nat”引入范围。

方程 File1.type1 = File_intf.type1 在 ok 函数的范围内。因此 type-directed 消歧可以扩展 File1.type1 的缩写来消歧字段 nat.

编译器会警告您字段 nat 本身不在范围内:

Warning 40: this record of type File1_intf.type1 contains fields
that are not visible in the current scope: nat.
They will not be selected if the type becomes unknown.