Sto cercando un modo per memoizzare i risultati di una funzione OCaml f
che richiede due parametri (o più, in generale). Inoltre (e questa è la parte difficile), voglio che la mappa sottostante questo processo dimentichi del tutto un risultato se uno dei valori per i due parametri è garbage collection.Risultato di memoizing debole della funzione multiparametro in OCaml
Per una funzione che richiede esattamente un argomento, questo può essere fatto con il modulo Weak
e il suo functor Make
in modo semplice. Per generalizzare questo a qualcosa che può memoizzare le funzioni di arità superiore, una soluzione ingenua è creare una mappa debole da tuple di valori a valori di risultato. Ma questo non funzionerà correttamente rispetto alla garbage collection, poiché la tupla di valori esiste solo nell'ambito della funzione di memoization, non il codice client che chiama f
. In effetti, il riferimento debole sarà alla tupla, che verrà raccolta dopo la memoizzazione (nel peggiore dei casi).
C'è un modo per farlo senza reimplementare Weak.Make
?
Hash-consing è ortogonale alle mie esigenze ed è, in effetti, non proprio desiderabile per i miei valori.
Grazie!
Posso vedere come la garbage collection del primo valore del parametro risulterebbe nel liberare la tabella corrispondente per il secondo parametro.Tuttavia, GCing di un valore in una tabella per il secondo parametro non fa nulla per il suo genitore (se viene utilizzato il modulo 'Weak'), anche se la mappa risultante è vuota. Ovviamente ciò potrebbe essere fatto analizzando attivamente il contenuto della mappa ed eliminando i primi parametri chiave che si associano alle tabelle vuote. – Nikos
Giusto, come ho detto che la tabella secondaria non verrà raccolta fino alla liberazione del primo parametro. Ma il valore di ritorno memorizzato sarebbe stato raccolto (mi sembra). –