[英]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 cyclic
是Error: 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.