OCaml中作为模块类型的存在类型

OCaml中作为模块类型的存在类型,ocaml,Ocaml,给定类型 type 'a ty 和一个模块类型 module type TY = (sig type a val x : a ty end) module type TY = sig type a val x: a ty end 我可以定义 let toTY (type b) (x' : b ty) : (module TY) = (module struct type a = b let x = x' end) 我想定义一个函数(尽管它不进行类型检查) 其预期效果

给定类型

type 'a ty
和一个模块类型

module type TY = (sig  type a  val x : a ty  end)
module type TY = sig
  type a
  val x: a ty
end
我可以定义

let toTY (type b) (x' : b ty) : (module TY) =
(module struct
  type a = b
  let x = x'
end)
我想定义一个函数(尽管它不进行类型检查)

其预期效果是,无论何时
m:(模块TY)
试图将其定义为

let ofTY (type b) (m : (module TY with type a = b)) : b ty = ...
没有预期的效果


定义ofTY的适当方法是什么?

OCaml不是依赖类型的,因此类型不能依赖于值。换句话说,由于
m
是一个值,
m.a
不能是一个类型

另一种查看问题的方法是在模块类型中

module type TY = (sig  type a  val x : a ty  end)
module type TY = sig
  type a
  val x: a ty
end
x
是按类型
a
进行存在量化的,没有办法删除这种存在量化,最多可以用不同的方式表示