Search code examples
functional-programmingf#memoization

F# Memoization - Persist?


What's the best way to persist/save the results of memoization so it can be loaded later?

There's this standard code snippet in F# for implementing memoization:

let memoize f =
    let dict = Dictionary<_, _>();
    fun c ->
        let exist, value = dict.TryGetValue c
        match exist with
        | true -> value
        | _ -> 
            let value = f c
            dict.Add(c, value)
            value

let mySlowFunc x= 
    // something very slow
    0

let myFastFunc = memoize mySlowFunc

After calling myFastFunc many times, I will have a dictionary full of results for mySlowFunc for various x's. I want to persist these results so ideally I can do something like:

let saveMemoziationResults myFastFunc "results.file" = ... // saves the dict to a file
let loadMemoziationResults "results.file" // loads the dict from a file

I can't figure out a way to "access" that dict in order to save it.


Solution

  • You could move dict creation to the caller, like

    let memoizeBase dict =
        let memoize f = …
        memoize
    

    And using it like

    let dict = new…
    let memoize = memoizeBase dict
    // use memoize and save/load dict when needed