f
2 つのパラメーター (またはそれ以上)を受け取る OCaml 関数の結果をメモする方法を探しています。さらに (これが難しい部分です)、2 つのパラメーターの値のいずれかがガベージ コレクションされる場合、このプロセスの基礎となるマップが結果を完全に忘れるようにします。
引数を 1 つだけ取る関数の場合、これはWeak
モジュールとそのMake
ファンクターを使用して簡単に行うことができます。これをより高いアリティの関数を記憶できるものに一般化するための単純な解決策は、値のタプルから結果値への弱いマップを作成することです。しかし、値のタプルはメモ化関数のスコープ内にのみ存在し、 を呼び出すクライアント コード内には存在しないため、これはガベージ コレクションに関しては正しく機能しませんf
。実際、弱い参照はタプルへのものであり、メモ化の直後にガベージ コレクションが行われます (最悪の場合)。
再実装せずにこれを行う方法はありWeak.Make
ますか?
Hash-consing は私の要件と直交しており、実際、私の価値観にはあまり望ましくありません。
ありがとう!