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