Слабое-запоминание результата много-параметрической функции в OCaml

Я ищу способ запомнить результаты функции OCaml f, которая принимает два параметра (или больше, вообще). Кроме того, (и это сложная часть), я хочу, чтобы карта, лежащая в основе этого процесса, вообще забывала результат, если любое из значений двух параметров было удалено сборщиком мусора.

Для функции, которая принимает ровно один аргумент, это можно сделать с помощью модуля Weakи его функтора Makeпростым способом. Чтобы обобщить это на что-то, что может запоминать функции более высокой арности, наивным решением будет создание слабой карты из кортежей значений в значения результата. Но это не будет работать корректно в отношении сборки мусора, так как кортеж значений существует только в рамках функции запоминания, а не в клиентском коде, который вызывает f. На самом деле, слабая ссылка будет на кортеж, который в худшем случае )будет удален сборщиком мусора сразу после мемоизации (.

Есть ли способ сделать это без пере-реализации Weak.Make?

Hash-consing ортогонален моим требованиям и, по сути, не совсем желателен для моих значений.

Спасибо!

7
задан Nikos 7 April 2012 в 17:05
поделиться