OCaml自参考地图

时间:2018-09-30 23:06:47

标签: dictionary ocaml

我正在寻找将缓存添加到OCaml中的简单编译器的方法。我已经创建了一个更简单的代码版本,该版本再现了同样的问题。我需要的缓存是能够创建一个以A为键的Map,这样我就可以查找编译输出。这是代码:

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中,type t是类似AST的递归类型。 cmp a b返回ineq。为了简洁起见,省略了编译功能,但是它只在运行计算量巨大的进程之前使用高速缓存。为了在A中创建一个缓存映射,我需要一个兼容的密钥模块。我的尝试是ACacheMapKey,但是type t = t并不指向父级。它给出的错误是Error: The type abbreviation t is cyclic。那么,是否有更好的方法可以在A上进行缓存?还是有一种简单的方法可以引用父对象并使我当前的结构正常工作?

1 个答案:

答案 0 :(得分:2)

类型定义与let绑定不同,默认情况下是递归的。类似于使用rec关键字使let绑定递归:

let rec f = ...

您可以使用nonrec关键字将类型定义设为非递归:

type nonrec t = t