我可以将模块的类型约束为元组吗?

时间:2014-02-09 23:54:06

标签: ocaml

我正在努力完成以下任务:

module type S = sig
       type 'a t
end

module A = struct
       type 'a t  = 'a list
end

module B = struct
       type ('a,'b) t  = ('a * 'b) list
end

module Make (P : S) = struct
       type 'a t = 'a P.t
end

module Single = struct
       include Make (A)
end

module Tuple = struct
       include Make (B)
end

基本上,我想重用make functor,除了在Tuple中,强制类型为元组。这可能吗?

我认为模块类型S搞砸了,这给了我错误:他们有不同的arities。也许有可能使用一流的模块来实现这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

你想要完成什么?如果您忘记了仿函数,您会发现模块B无法满足签名S。例如:

module B1 = (B : S)

会给你同样的错误。这里的问题是,您的单一t中的类型S只接受1种类型变量。您不能将此签名应用于类型为t且具有2个类型变量的模块。