【问题标题】:OCaml Self-Referential MapOCaml 自参照映射
【发布时间】:2018-09-30 23:06:47
【问题描述】:

我希望在 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。为简洁起见,compile 函数被省略了,但它只是在运行计算昂贵的过程之前使用缓存。为了在 A 中创建缓存映射,我需要一个兼容的键模块。我的尝试是ACacheMapKey,但type t = t 不是指父级。它给出的错误是Error: The type abbreviation t is cyclic。那么,有没有更好的方法在 A 上进行缓存?或者有没有一种简单的方法来引用父级并使我当前的结构正常工作?

【问题讨论】:

    标签: dictionary ocaml


    【解决方案1】:

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

    let rec f = ...
    

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

    type nonrec t = t
    

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多