我正在尝试派生一个描述结构化值的 Graphviz 文件。这是出于诊断目的,所以我希望我的图表尽可能地反映内存中的实际结构。我正在使用以下内容将值映射到 Graphviz 顶点,以便在值具有两个或多个入站引用时可以重用顶点:
let same = (==)
module StateIdentity : Hashtbl.HashedType = struct
type t = R.meta_t state
let hash = Hashtbl.hash
let equal = same
end
module StateHashtbl = Hashtbl.Make (StateIdentity)
的文档Hashtbl.hash
建议它适合在何时StateIdentity.equal = (=)
和何时使用,StateIdentity.equal = (==)
但我想确保哈希表访问尽可能接近 O(1),因此宁愿不Hashtbl.hash
走一个(在这种情况下可能很大)对象每次查找的图表。
我知道 Ocaml 会移动引用,但是 Ocaml 中是否有用于引用标识的 O(1) 代理?
Ocaml中可变变量哈希表的答案表明不是。
我不愿意将序列号附加到状态,因为这是诊断代码,所以我所做的任何错误都有可能掩盖其他错误。