Dictionary OCaml自参考映射

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

我想在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 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