私は48 時間以内に自分でスキームを書く(私は約 85 時間までです) に取り組んでおり、変数と代入の追加に関する部分に到達しました。この章には大きな概念上のジャンプがあります。最終的な解決策に直接ジャンプするのではなく、その間に適切なリファクタリングを行って 2 つのステップで実行されていればよかったのにと思います。とにかく…</p>
同じ目的を果たしているように見える多くの異なるクラスで迷子になりました: State
、ST
、IORef
、およびMVar
. 最初の 3 つはテキストで言及されていますが、最後の 3 つは、最初の 3 つに関する多くの StackOverflow の質問に対する好まれる回答のようです。それらはすべて、連続する呼び出しの間に状態を保持しているようです。
これらはそれぞれどのようなもので、どのように互いに異なるのでしょうか?
特に、次の文は意味がありません。
代わりに、状態スレッドと呼ばれる機能を使用して、Haskell に集約状態を管理させます。これにより、変数を取得または設定する関数を使用して、他のプログラミング言語と同じように変更可能な変数を扱うことができます。
と
IORef モジュールを使用すると、IO モナド内でステートフル変数を使用できます。
これらすべてが行をtype ENV = IORef [(String, IORef LispVal)]
混乱させます-なぜ2番目なのIORef
ですか? type ENV = State [(String, LispVal)]
代わりに書くと何が壊れますか?