私は構造化された値を記述するGraphvizファイルを派生させようとしています。これは診断目的のためです。実際の構造を可能な限り密接にメモリに反映させたいのです。私は、値が2つの以上のインバウンドの参照を持っているとき、私は頂点を再利用できるように、Graphvizの頂点に値をマッピングするには、以下の使用しています:Hashtbl.hashへの物理的なIDベースの代替
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)に近いことを確認したいので、すべてのルックアップで(おそらくこの場合は大きな)オブジェクトグラフを歩くことは避けたい。
私はOcamlの動きの参照を知っていますが、Ocamlで利用可能な参照IDのためのO(1)プロキシがありますか?
Hashtable of mutable variable in Ocamlへの回答は示唆していません。
これは診断コードなので、シリアル番号をステートに添付するのは嫌です。エラーが発生すると、他のバグを隠す可能性があります。
"Hashtbl.hashのドキュメントは、StateIdentity.equal =(=)とStateIdentity.equal =(==)の両方の場合に使用するのに適していることを示唆しています。 'Hashtbl.hash'は物理的な平等に関連するときに多くの衝突を持ちます。つまり、あなたが使っていたハッシュテーブルは、構造的に等しい、物理的に異なるキーの長いリストの短い配列に縮退するかもしれません。 –
@ PascalCuoq、かなり正しい。 「適切」とは、「置換を維持して不変式を見つける」ことを意味し、ルックアップのキー比較の数を一定に保つことを指していませんでした。 –