Ich nehme an, was Sie fragen, ist , wie man eine Funktion memoise. Memo bedeutet, wenn eine (möglicherweise teure) Funktion einmal mit einigen Argumenten x,y,z
ausgewertet wurde und zu einem späteren Zeitpunkt mit den gleichen Argumenten erneut ausgewertet wird, muss der Prozessor nicht wirklich alle Berechnungen erneut durchführen, sondern nur das Ergebnis nachschlagen in irgendeiner Art von Tabelle.
Dafür gibt es einfache Bibliotheken. Mit MemoTrie
:
import Data.MemoTrie
f :: Int -> Int
f x = ... -- some expensive computation
fm :: Int -> Int
fm = memo f
Nun, wenn Sie f 0
zweimal hintereinander anrufen, wird es zweimal verbringen viel zu beenden. OTOH, fm 0
dauert nur das erste Mal lange, das zweite Mal wird es das Ergebnis fast sofort geben.
Wenn Sie wissen, dass Sie nur f
memoised verwenden möchten, können Sie es auch auf diese Weise definieren sofort:
f :: Int -> Int
f = memo $ \x -> ...
Int -> Int
ist nur ein Beispiel Unterschrift. Das Ergebnis einer solchen Funktion kann einen beliebigen Typ haben, und die Argumente können auch so ziemlich jeden "diskreten" Typ sein (jede ganze Zahl, Tupel, Strings ...).
MemoTrie
, wie die meisten solcher Bibliotheken, werden nur die Ergebnisse im RAM speichern. Wenn also Ihr Programm existiert und Sie es völlig neu beginnen, werden die gemeldeten Ergebnisse weg sein und müssen schließlich neu berechnet werden. Speichern von Ergebnissen persistent ist mehr beteiligt. Mir ist keine Bibliothek bekannt, die das automatisch macht. Was ein wenig problematisch ist, ist, dass der Zustand, dessen Argumente bereits ausprobiert wurden, nicht wirklich Teil der Haskell-Semantik ist.
Ich habe mich kürzlich mit einem Projekt beschäftigt, das etwas sehr Verwandtes tut.
https://github.com/leftaroundabout/lazy-hash
Wie hätten Sie Zugriff auf die vorherigen Ergebnisse? –
Sie sollten sich wahrscheinlich 'Control.Monad.Trans.State' anschauen. Es tut nicht ganz das, was Sie gefragt haben, aber ich denke, es ist wahrscheinlich das, was Sie wollen. – dfeuer
Mögliche Duplikate von [Memoization in Haskell?] (Https://stackoverflow.com/questions/3208258/memoisation-in-haskell) – jberryman