在 OCaml 中内联本地抽象类型

inline locally abstract types in OCaml

我是否必须编写函数来本地绑定类型?

使用辅助函数可行,但在解构期间尝试将其作为术语类型装饰的一部分似乎行不通。

type ('a, 'b) eq
type 'a repr = TpFun : ('a, 'x -> 'y) eq   -> 'a repr

let rewrite1 (type x y b f) (fxy : (f, x -> y) eq) : (f, x -> b) eq =
  failwith ""

let eqp : type a b. a repr -> (a, b) eq = function
  | TpFun (fxy) ->
      let x = rewrite1 fxy in
      _

let eqpFAIL : type a b. a repr -> (a, b) eq = function
  | TpFun ((fxy : type x y. (a, x -> y) eq) ) ->
      let x = failwith "" in
      _

https://ocaml.org/manual/gadts-tutorial.html#s%3Aexplicit-existential-name中所述,在模式中绑定存在类型的正确语法是

let eqp : type a b. a repr -> (a, b) eq = function
  | TpFun (type x y) (fxy :(a, x -> y) eq) ->
      assert false

另请注意,您可能不想对 eq 使用抽象类型,因为类型检查器无法推断任何可能已定义为缩写的抽象类型的 属性!

type ('a, 'b) eq = int

我通常建议使用具有现有名称的类型定义:

type ('a,'b) eq = Eq

因为该构造保证了类型构造函数参数的单射性,并允许类型检查器推断出一些类型不等式。