2011-12-29 12 views

答えて

6

Mercuryではすべてがデフォルトで(IOでも)純粋であり、まれに必要な機能を使用せずに不純なコードを書くことは不可能です。

純粋IOは、一意性と世界標準のパラメータを使用して、Cleanと同様の方法で処理されます(私は信じています)。 Mercuryでは、一意性はタイププロパティではなくモードのプロパティとみなされます。 (この文脈での「モード」は、データの流れの方向性にほぼ等しい)

しかし、水銀には静的純度システムもあります。一部のコードは、不純な(外部言語インターフェイスへの呼び出し、または不完全な関数/述部への呼び出し、変更可能な変数へのアクセス、その他のいくつかのケース)としてコンパイラによって認識されます。そのようなコードは、明示的にimpureと宣言しなければならないか、コンパイラエラーです。コンパイラは不純物を認識しているので、不純物の混入したコードに影響する可能性のある並べ替えやその他の最適化を実行しません。あるレベルで、不純な操作のまわりで純粋なインターフェースを提供できる場合は、関数/述部が実際に純粋であることをコンパイラーに約束することができます。さもなければ、必要な不純物宣言はすべてmain述語まで伝搬します。これを行う準備ができていれば、本質的に水銀でプログラムすることができます(これは楽しいことではありません)。

水銀もまた、semipureという概念を持っています。これは、他の半不純なコード(純粋なコードは他のコードの副作用の影響を受けません)の副作用を伴わないコードですが、他の不純なコードの副作用によって影響を受けるかもしれません。この余分なレベルの情報は、副作用が「見える」ために純粋ではないが、それ自体は存在しない呼び出しは、コンパイラによってさらに自由に最適化できることを意味します。彼らの結果が必要でなければ最適化することができ、impure呼び出しを "上回って"移動されない限り、順序を変更することができます。

2

D programming languageは、の純粋な関数であり、の弱い関数純粋な関数です。非常に純粋な関数は、あなたがHaskellで得るものと多くの点で似ています。一方、弱く純粋な関数は、引数を変更することができますが、グローバルな状態を変更することはできません。その考え方は、が純粋で純粋であるということです。:関数のプライベート状態が拡張され、グローバル状態を変更せずにプライベート状態を変更できる関数が許可されます。

2

ハスケルは、I/O状態を無限ストリームのペアとして扱うために使用されました。一例として(大幅に簡略化)、主な機能は応答のストリームであった1つの引数をとり、要求のストリームであった1つの結果を生成しました。出力ストリームで要求を「放出」した後、対応する応答は、ストリーム内の同じ位置の入力ストリームにおいて利用可能となる。 Haskellのストリームは単なるデータ構造なので、これは機能していたので、古い応答にいつでもアクセスできます。 This paperはより良い説明を与えます。

存在するもう1つのパラダイムは、Functional Reactive Programmingのパラダイムです。 FRPには、という動作と呼ばれる特別なタイプの値が導入されています。その値は、「実世界」(ディスク上のファイル、マウスの位置など)にあるオブジェクトの現在の値を反映します。入力動作を機能的な方法で組み合わせることで、出力動作を生成することができます。出力動作は、実装によって「現実世界」のもの(ディスプレイの内容など)を更新するために使用されます。ほとんどのFRP実装では、イベントと呼ばれる第2の特別なタイプの値も導入されています。これは、時間的に離散的な時点(キー押下やマウスクリックなど)でしか動作しない動作に相当し、 (最も重要なのは、何らかの事象が発生したときの過去のある時点での行動の価値を「覚えている」)ことである。

関連する問題