2017-06-10 3 views
1

Nur eine allgemeine Frage:Wie speichert man die Ergebnisse einer Funktion?

Ich bin ziemlich neu in Haskell (und Programmierung im Allgemeinen, für diese Angelegenheit), und ich würde gerne wissen, wie es möglich ist, die Ergebnisse einer Funktion zu speichern, egal wie oft, dass Funktion wird ausgeführt. Wenn ich meine Funktion ausführe, möchte ich, dass das Ergebnis irgendwo gespeichert wird, so dass ich, egal wie oft ich die Funktion mit anderen Parametern aufrufen muss, auf alle vorherigen Ergebnisse zugreifen kann.

Jede Hilfe wäre willkommen.

+1

Wie hätten Sie Zugriff auf die vorherigen Ergebnisse? –

+0

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

+0

Mögliche Duplikate von [Memoization in Haskell?] (Https://stackoverflow.com/questions/3208258/memoisation-in-haskell) – jberryman

Antwort

2

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

Verwandte Themen