「48時間でSchemeを書こう/変数と代入」の版間の差分

削除された内容 追加された内容
編集の要約なし
重複の削除。
3 行
 にも関わらず、Haskellでは同じ状態をシミュレートする方法がいくつかあり、全てモナドに関係します。一番シンプルなのは、おそらくState モナドです。このモナドは、任意の状態をモナドの中に隠しておいて、舞台裏で周囲に渡します。貴方は、パラメータとして、状態のタイプをこのモナドに記入し、普通はdoブロックの中から、get と putの機能を使って、アクセスすることができます(もし関数がIntegerを返してきて、でもStringの二組のリストに変更するなら、それは<span class="inline_code"> State [(String,String)] Integer</span>という型を持ちます)。貴方は、戻り値と最終状態を含んだペアを返す<span class="inline_code">runState myStateAction initialList</span>を通じて、初期状態を記述します。
 
 残念なことに、このStateモナドは私たちのためには上手く動いてはくれません。というのも、私たちが格納しておきたいデータの型というのは、かなり複雑だからです。もっともシンプルな環境では、変数名から値にマッピングするのを格納することによって、[(String, LispVal)]でやり通すことができますが、しかし、私たちが関数の呼び出しを扱い始めると、これらのマッピングは、任意の深さの、入れ子になった環境のスタックになるでしょう。そして、私たちがクロージャーを追加したとき、この環境は環境はきっと任意の関数の値に保存され、そしてプログラム全体から返されるかもしれません。事実、容認できなくなるまで、値を保存し、runStateモナドは完全に潰されるでしょう。
 
 代わりに、私たちは''State スレッド''と呼ばれるものを使って、私たちの為に、この集合状態をHaskellに管理させましょう。これは変数を得たり、設定する為の機能を使って、他のプログラム言語と同じように、可変変数を扱うことができるようになります。Stateスレッドには二つの種類があります。the [http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-ST.html ST monad] は残りのプログラムへ状態を回避させることなしに、単体で実行されるような、ステートフルな変数を作り出すSTモナドです。また、[http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-IORef.html IORef モジュール]は、IO monadの中で、私たちにステートフルな変数を使わせてくれます。状態を、どんな方法でもいいので、仲介する必要がありますので(REPLの中で、行間を持続させ、最終的に、言語自身にIO functionを持つとしても)、私たちはIO Refsを扱います。