簡體   English   中英

OCaml 自引用映射

[英]OCaml Self-Referential Map

我正在尋找向 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 ab返回一個ineq 為簡潔起見省略了 compile 函數,但它只是在運行計算成本高的過程之前使用緩存。 為了在 A 中創建緩存映射,我需要一個兼容的密鑰模塊。 我的嘗試是ACacheMapKey ,但type t = t不引用父級。 它給出的Error: The type abbreviation t is cyclicError: The type abbreviation t is cyclic 那么,有沒有更好的方法在 A 上做緩存呢? 或者是否有一種簡單的方法來引用父項並使我當前的結構正常工作?

類型定義與 let 綁定不同,默認情況下是遞歸的。 與使用rec關鍵字使 let 綁定遞歸的方式類似:

let rec f = ...

您可以使用nonrec關鍵字使類型定義成為非遞歸的:

type nonrec t = t

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM