gpt4 book ai didi

ocaml - OCaml 中的高阶类型(幻像类型子类型化)

转载 作者:行者123 更新时间:2023-12-04 02:54:11 25 4
gpt4 key购买 nike

我正在使用虚拟类型来模拟堆栈的状态,作为 ocaml-lua 的包装器模块(Lua 通过堆栈与 C/OCaml 通信)。小代码示例:

type 's t
type empty
type 's table
type top

val newstate : unit -> empty t (* stack empty *)
val getglobal : empty t -> top table t (* stack: -1 => table *)

某些堆栈操作在表和数组表上都是可能的(Lua 中没有真正的数组);有些不是。所以如果我有类型

type 's table
type 's array

我想要一种类似于表或数组的函数,用于在两种类型上运行的函数,但仍然能够禁止例如rawgeti (数组操作)表。 objlen 是一个堆栈操作,它返回堆栈顶部元素的“长度”。此元素可以是表或数组表。目前,包装函数定义如下:

val objlen : (top table) t -> int

我想要的是

val objlen : (top table-or-array) t -> int

也就是说,arraytabletable-or-array的子类型。

有什么想法吗?

问候偶来

编辑

经过深思熟虑,我想到了这个:

module M : sig
type ('s, 't) t

(* New Lua state with empty stack *)
val newstate : unit -> (unit, unit) t

(* Get table *)
val getglobal : ('a) t -> ([< `table | `string | `number | `fn], 'a) t

(* Get array index and put "anything" on top of stack *)
val rawgeti : ([`table], 'a) t -> ([< `table | `string | `number | `fn], [`table] * 'a) t

(* String on top of stack *)
val tostring : ([`string], _) t -> string

(* Table or array-table on top of stack *)
val objlen : ([`table], _) t -> int

val pop : ('a, 'b * 'c) t -> ('b, 'c) t
end = struct
type top
type ('s, 't) t = string (* Should really be Lua_api.Lua.state *)

(* Dummy implementations *)
let newstate () = "state"
let gettable s = s
let getarray s = s
let rawgeti s = s
let tostring s = "Hello phantom world!"
let objlen s = 10
let pop s = s
end

类型级别的堆栈现在应该知道的不多于堆栈本身。例如。 rawgeti 将压入任何类型的堆栈。

最佳答案

下面的结构呢?

type ('data, 'kind) t
type array_kind
type stack_kind

(* use tuples as type-level lists:
(a * (b * (c * unit))) for the stack of type-shape [a;b;c] *)
val newstate : unit -> (unit, stack) t
val getglobal : (unit, stack) t -> (top * unit, stack) t

val objlen : (top * 'a, 'k) t -> int

这使用多态性(在 'k 上)来表达“任何种类都是很好”。使用多态变体,可以使用子类型相反,但我宁愿建议反对它,因为它更复杂及其与 GADT 的交互(你想使用在内部实现你的幻影类型签名,或者直接公开 GADT)问题更大。

PS:这正是标准Bigarray模块出于类似目的使用“种类类型”。

编辑:上面的公式有点笨拙,因为多态变体也使用多态性(在受限的特定情况下使用子类型),并且可以仅在类型级变体中使用多态性。我关于此解决方案过于复杂的评论仍然有效。

关于ocaml - OCaml 中的高阶类型(幻像类型子类型化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16992147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com