我有

module type T = sig
    type t
end


module Make (TypeProvider : T) = struct
    include TypeProvider
    type d = Wrapped of t
end


module Test = struct
    include Make (struct type t = ForWrap end)
    let f = function | Wrapped ForWrap -> ()
end

我想像编译后的测试
module Test = struct
    type t = ForWrap
    type d = Wrapped of t
    let f = function | Wrapped ForWrap -> ()
end

但实际上,它不是可编译的代码。 OCaml对我说:
module Test = struct
    include Make (struct type t = ForWrap end)
    let f = function | Wrapped ForWrap -> ()
                               ^^^^^^^


end

我不明白为什么。
我的解决方案有什么问题?

最佳答案

让我们看看Make (struct type t = ForWrapp end)的签名:

module M = Make(struct type t = ForWrapp end)
ocamlc -c -i xxx.ml向您显示此模块的签名:
module M : sig
  type t
  type d = Wrrapped of t
end

请注意,构造函数ForWrapp在result模块中不可用。这就是为什么您的代码不进行类型检查的原因。

为什么构造函数不见了?这是因为函子Make的参数签名是TT定义了t类型,它是抽象的。即使将Make应用于具有更详细签名的模块(此处为struct type t = ForWrapp end),该模块也会被强制转换为T,并且构造函数信息也会丢失。

10-06 09:57