Я работаю через Напишите себе схему за 48 часов (я до примерно 85 часов), и я получил часть о Добавление переменных и присвоений. В этой главе есть большой концептуальный прыжок, и я бы хотел, чтобы это было сделано в два этапа с хорошим рефакторингом между ними, а не с прямым выходом к окончательному решению. В любом случае...
Я потерялся с несколькими разными классами, которые, похоже, выполняют одну и ту же цель: State
, ST
, IORef
и MVar
. Первые три упоминаются в тексте, в то время как последний, по-видимому, является предпочтительным ответом на многие вопросы StackOverflow о первых трех. Кажется, что все они несут состояние между последовательными вызовами.
Каковы каждый из них и как они отличаются друг от друга?
В частности, эти предложения не имеют смысла:
Вместо этого мы используем функцию, называемую потоками состояний, позволяя Haskell управлять агрегатным состоянием для нас. Это позволяет нам рассматривать изменчивые переменные, как и в любом другом языке программирования, используя функции для получения или установки переменных.
и
Модуль IORef позволяет использовать переменные состояния внутри монады IO.
Все это делает строку type ENV = IORef [(String, IORef LispVal)]
запутанной - почему вторая IORef
? Что сломается, если я напишу type ENV = State [(String, LispVal)]
вместо этого?