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