2012-02-06 2 views
3

Haskellのデータは不変なので、どの関数でも変更できるリストはどのようにグローバルに保存するのですか?muiltithreadをループに格納するか、リストをファイルに書き出しますか? ユーザーがクリックするボタンの量を記録する必要があります。Haskell不変のデータ

+8

広く言えば、あなたはそうではありません。特に初心者の方には、おそらくあなたがハスケルに他の言語を書こうとしていることを意味します。 –

答えて

12

通常、あなたが言うように、Haskellのデータは(ほとんど)不変です。

リストから始め、一連の更新関数を実行する場合、各関数はリストとして引数をとり、その結果として更新リストを返します。次に、各アップデートの出力を次のアップデータに送る調整機能(おそらくmain、これがあなたのプログラムのすべてである場合)を持っています。

暗黙の状態更新でプログラムするState monadのようなものを使用するか、または実際にその場で物事を更新することができ、暗黙の状態更新でプログラムするIOモナドでSTモナドやIORefsでSTRefsを使用することが可能です。しかし、Haskellのプログラマは、通常、そのようなモナドのプログラムの大部分を、書き込み可能な値への暗黙的なグローバルなアクセスを持たないようにしたいと考えています。

2

状態モナド(またはioモナド、STモナドなど)を使用します。あるいは、すべての関数にパラメータとして渡して、すべての関数から新しい値を返すことができます(これは、さまざまなモナドがあなたのために行うものです)。

状態を必要とするすべての機能をモナドに使用せずにグローバル可変状態を持つ方法はありません。これは、Haskellの設計者が意図的に選択したものです。すべての非モナド関数は、明示的に透明である必要があります(これは、関数が常に与えられた入力セットに対して同じ値を返すことを意味します)。モナドでない関数であれば、可変状態を返し、参照透過性に違反する可能性があります。

技術的には、モナド関数もまた参照性があり、副作用をシミュレートするものであっても、(モナドの一部として隠されている)余分なワールドパラメータを取得して返すことでこれを行います。

+0

そうではありませんが、まったく正しいですが、閉じています(隠されたワールドパラメータはなく、変更可能な状態のために任意のMonadを使用することはできません)。 – ivanm