Экзистенциальные типы как типы модулей в OCaml

#ocaml

#ocaml

Вопрос:

Заданный тип

 type 'a ty
 

и тип модуля

 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)
 

и я хотел бы определить функцию (хотя это не проверяет тип)

 let ofTY (m : (module TY)) : m.a ty = ???
 

с предполагаемым эффектом, который всякий m : (module TY) раз, когда затем ofTY m : m.a ty , поэтому
пытается определить его как

 let ofTY (type b) (m : (module TY with type a = b)) : b ty = ...
 

не имеет предполагаемого эффекта.

Каков подходящий способ определения ofTY ?

Ответ №1:

Типизация OCaml не зависит, поэтому тип не может зависеть от значения. Другими словами, поскольку m является значением, m.a не может быть типом.

Другой способ увидеть проблему заключается в том, что в типе модуля

 module type TY = sig
  type a
  val x: a ty
end
 

значение x экзистенциально определяется количественно по типу a , и нет способа удалить такое экзистенциальное количественное определение, в лучшем случае вы можете выразить его по-разному.