Ich bin neu bei Haskell und verstehe, dass es (im Grunde) eine reine funktionale Sprache ist, was den Vorteil hat, dass sich die Ergebnisse der Funktionen über mehrere Auswertungen hinweg nicht ändern. Angesichts dessen frage ich mich, warum ich eine Funktion nicht einfach so markieren kann, dass sie sich die Ergebnisse ihrer ersten Auswertung merkt und nicht jedes Mal, wenn ihr Wert benötigt wird, erneut ausgewertet werden muss.Gibt es eine Möglichkeit, Ergebnisse in Haskell zu "konservieren"?
In Mathematica zum Beispiel gibt es eine simple idiom um dies zu erreichen:
f[x_]:=f[x]= ...
aber in Haskell, die nächsten Dinge, die ich gefunden habe, ist something like
f' = (map f [0 ..] !!)
where f 0 = ...
f n = f' ...
die zusätzlich zu der viel weniger klar (und scheinbar auf Int
Argumente beschränkt?) nicht Ergebnisse in einer interaktiven Sitzung (scheint) zu bewahren.
Zugegeben (und klar), ich verstehe nicht genau, was hier vor sich geht; aber naiv, wie es scheint, Haskel sollte eine gewisse Art und Weise haben, bei der Definition der Funktion Ebene von
- Vorteil der Tatsache, dass seine Funktionen sind Funktionen und das Überspringen Neuberechnung ihrer Ergebnisse, sobald sie berechnet wurden und
- , was den Wunsch anzeigt, dies auf Ebene der Funktionsdefinition mit einem einfachen und sauberen Idiom zu tun.
Gibt es eine Möglichkeit, dies in Haskell zu erreichen, die ich vermisse? Ich verstehe (so), dass Haskell die Bewertungen nicht als "Zustand" speichern kann, aber warum kann er ausgewertete Funktionen nicht einfach (in Wirklichkeit) als ihren berechneten Wert definieren?
Dies erwächst aus this question, bei dem Fehlen dieser Funktion führt zu schrecklichen Leistung.
GHC hat entschieden, dass Sie wahrscheinlich zu viel Speicher verwenden würden, wenn Sie sich an die Funktionsanwendung erinnern, und es ist wahrscheinlich richtig. Es erinnert sich jedoch an Konstanten. – PyRulez
Eine andere Haskell-Implementierung wäre frei, Funktionen zu memoisieren, wenn es ihnen gefällt. – PyRulez