在 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
因为该构造保证了类型构造函数参数的单射性,并允许类型检查器推断出一些类型不等式。
我是否必须编写函数来本地绑定类型?
使用辅助函数可行,但在解构期间尝试将其作为术语类型装饰的一部分似乎行不通。
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
因为该构造保证了类型构造函数参数的单射性,并允许类型检查器推断出一些类型不等式。