Sto lavorando a Scrivi uno schema in 48 ore (ho circa 85 ore) e sono arrivato alla parte relativa all'aggiunta di variabili e compiti . C'è un grande salto concettuale in questo capitolo, e vorrei che fosse stato fatto in due fasi con un buon refactoring nel mezzo piuttosto che saltare direttamente alla soluzione finale. Comunque…
Ho ottenuto perso con un certo numero di classi diverse che sembrano servire allo stesso scopo: State
, ST
, IORef
, e MVar
. I primi tre sono menzionati nel testo, mentre l'ultimo sembra essere la risposta preferita a molte domande StackOverflow sui primi tre. Sembrano tutti portare uno stato tra invocazioni consecutive.
Cosa sono ciascuno di questi e in che modo differiscono l'uno dall'altro?
In particolare queste frasi non hanno senso:
Invece, utilizziamo una funzionalità chiamata thread di stato , che consente a Haskell di gestire lo stato aggregato per noi. Questo ci consente di trattare le variabili mutabili come faremmo in qualsiasi altro linguaggio di programmazione, utilizzando le funzioni per ottenere o impostare variabili.
e
Il modulo IORef consente di utilizzare variabili stateful all'interno della monade IO .
Tutto ciò rende la linea type ENV = IORef [(String, IORef LispVal)]
confusa: perché la seconda IORef
? Cosa si romperà se scriverò type ENV = State [(String, LispVal)]
invece?