如何包括工作?

时间:2016-06-05 19:43:13

标签: module compiler-errors include ocaml functor

我有

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 -> ()
                               ^^^^^^^
  

错误:未绑定的构造函数ForWrap

end

我无法理解为什么。 我的解决方案有什么问题?

1 个答案:

答案 0 :(得分:6)

让我们看一下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在结果模块中不可用。这就是您的代码不进行类型检查的原因。

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