Ich bin auf der Suche nach einer Möglichkeit, die Ergebnisse einer OCaml-Funktion f
Memo, die zwei Parameter (oder mehr, im Allgemeinen). Zusätzlich (und das ist der schwierige Teil) möchte ich, dass die diesem Prozess zugrunde liegende Map ein Ergebnis ganz vergisst, wenn einer der beiden Werte für die beiden Parameter "Garbage Collected" ist.Weak-Memoizing Ergebnis der Multi-Parameter-Funktion in OCaml
Für eine Funktion, die genau ein Argument benötigt, kann dies mit dem Modul und seinem Make
Funktor auf einfache Art und Weise durchgeführt werden. Um dies auf etwas zu verallgemeinern, das höherwertige Funktionen beschreiben kann, besteht eine naive Lösung darin, eine schwache Abbildung von Tupeln von Werten zu Ergebniswerten zu erstellen. Dies funktioniert jedoch nicht ordnungsgemäß in Bezug auf die Garbage Collection, da das Tupel der Werte nur innerhalb des Bereichs der Memo-Funktion existiert, nicht der Client-Code, der f
aufruft. In der Tat wird die schwache Referenz auf das Tupel sein, das direkt nach der Memo-Erfassung (im schlimmsten Fall) Müll gesammelt wird.
Gibt es eine Möglichkeit, dies zu tun, ohne Weak.Make
erneut zu implementieren?
Hash-Consing ist orthogonal zu meinen Anforderungen und ist in der Tat nicht wirklich wünschenswert für meine Werte.
Danke!
Ich kann sehen, wie die Garbage Collection des ersten Parameterwerts dazu führen würde, dass die entsprechende Tabelle für den zweiten Parameter freigegeben wird.GCing einen Wert in einer Tabelle für den zweiten Parameter tut jedoch nichts für seine Eltern (wenn das Modul 'Weak' verwendet wird), auch wenn die resultierende Zuordnung leer ist. Natürlich könnte dies getan werden, indem der Inhalt der Karte aktiv abgetastet wird und alle ersten Parameterschlüssel gelöscht werden, die auf leere Tabellen abgebildet werden. – Nikos
Richtig, wie ich sagte, die sekundäre Tabelle wird nicht gesammelt, bis der erste Parameter freigegeben ist. Aber der gemeldete Rückgabewert würde gesammelt werden (es scheint mir). –