Ich arbeite daran, in 48 Stunden ein Schema zu schreiben (ich bin bis zu 85 Stunden) und bin zu dem Teil über das Hinzufügen von Variablen und Zuweisungen gekommen . In diesem Kapitel gibt es einen großen konzeptionellen Sprung, und ich wünschte, es wäre in zwei Schritten mit einem guten Refactoring dazwischen gemacht worden, anstatt direkt zur endgültigen Lösung zu springen. Wie auch immer…
Ich habe mit einer Reihe von verschiedenen Klassen verloren gegangen, die den gleichen Zweck zu dienen scheinen: State
, ST
, IORef
, und MVar
. Die ersten drei werden im Text erwähnt, während die letzte die bevorzugte Antwort auf viele StackOverflow-Fragen zu den ersten drei zu sein scheint. Sie alle scheinen einen Zustand zwischen aufeinanderfolgenden Anrufungen zu haben.
Was sind diese und wie unterscheiden sie sich voneinander?
Insbesondere machen diese Sätze keinen Sinn:
Stattdessen verwenden wir eine Funktion namens Status-Threads , mit der Haskell den Gesamtstatus für uns verwalten kann. Auf diese Weise können wir veränderbare Variablen wie in jeder anderen Programmiersprache behandeln und Funktionen zum Abrufen oder Festlegen von Variablen verwenden.
und
Mit dem IORef-Modul können Sie statusbehaftete Variablen innerhalb der E / A-Monade verwenden .
All dies macht die Linie type ENV = IORef [(String, IORef LispVal)]
verwirrend - warum die zweite IORef
? Was wird kaputt gehen, wenn ich type ENV = State [(String, LispVal)]
stattdessen schreibe ?