3

为什么我不能在 OCaml 中强制记录类型?像这样的基本类型int工作正常。

下面是一个示例,其中我构建了一个M包含在 module 中的基本模块AM.t是类型的缩写A。只要M.tint,我都能做到A.t' :> M.t。当我将其更改为 时{i : int},编译器会说它不是子类型。我猜这有一个非常具体的原因?

module M = struct
  type t = {i : int}
  let make () = {i = 10}
end

module A : sig
  include module type of M
  type t' = private t
  val make : unit -> t'
end = struct
  include M
  type t' = t
end

在顶层:

(A.make() :> M.t);;
Error: Type A.t' is not a subtype of M.t 
4

1 回答 1

3

那是因为A.t'与 没有关系M.t,因为include不“保留”相等性,它只是从字面上复制模块结构(或签名)并将其内联(作为新的类型和值)。因此 type与因此M.t没有任何关系(并且不同的记录类型没有像说对象或模块那样定义的结构子类型)。明显的修复是.A.tA.t'type t' = private M.t

更新

看来上述内容并不完全正确,因为type t' = private M.t在签名和include M type t' = t实现中进行类型检查,因此include M保留了相等性(否则它无法匹配签名type t' = private M.t),这与复制粘贴 . 的内容M不同include M。但这“显然”并不适用于include module type of创建新类型..

于 2013-07-10T01:51:30.883 回答