Dictionary OCaml自参考映射
我想在OCaml中为一个简单的编译器添加一个缓存。我已经创建了一个更简单的代码版本,它复制了相同的问题。缓存所需要的是能够创建一个以a为键的映射,以便查找编译输出。代码如下:Dictionary OCaml自参考映射,dictionary,ocaml,Dictionary,Ocaml,我想在OCaml中为一个简单的编译器添加一个缓存。我已经创建了一个更简单的代码版本,它复制了相同的问题。缓存所需要的是能够创建一个以a为键的映射,以便查找编译输出。代码如下: module A = struct type ineq = | LT | EQ | GT type t = ... module ACacheMapKey = struct type t = t let compare a b = match cmp a
module A
= struct
type ineq =
| LT
| EQ
| GT
type t =
...
module ACacheMapKey
= struct
type t = t
let compare a b =
match cmp a b with
| LT -> -1
| EQ -> 0
| GT -> 1
end
module CMap = Map.Make(ACacheMapKey)
let cache_map = CMap.empty
let cmp a b =
...
end
在模块A中,
类型t
是一种类似于AST的递归类型<代码>cmp a b返回一个ineq
。为了简洁起见,没有使用compile函数,但它只是在运行一个计算代价高昂的进程之前使用缓存。为了在中创建缓存映射,我需要一个兼容的密钥模块。我的尝试是ACacheMapKey
,但是类型t=t
并不指向父级。它给出的错误是错误:类型缩写t是循环的。那么,有没有更好的方法在服务器上创建缓存?或者有没有一种简单的方法可以引用父级并使当前结构正常工作?类型定义与let绑定不同,默认情况下是递归的。因此,与使用rec
关键字使let绑定递归类似:
let rec f = ...
type nonrec t = t
您可以使用nonrec
关键字使类型定义非递归:
let rec f = ...
type nonrec t = t