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.
我有一个很费解的例子,就是下面那个“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.