2012-06-29 16 views
7

現在、アーランをマスターしようとしています。これは私が調べた最初の関数型プログラミング言語であり、Erlangでは、あなたが行う各代入は単一の代入であることに気付きました。そして明らかに、Erlangだけでなく、多くの他の関数型プログラミング言語では、代入は1回の代入によって行われます。シングルアサインメントの目的

私は本当にそのようにした理由について本当に混乱しています。どのような単一の割り当ての目的は正確ですか?私たちはそれからどんな利益を得ることができますか?

+0

[この回答](http://stackoverflow.com/a/9764997/1229023)を確認することをお勧めします。要するに、それはそのような割り当てではない。これは名前のバインドプロセスです。 – raina77ow

+0

おそらく[programmers.se]に適しています。 – darvids0n

+0

[この質問](http://stackoverflow.com/questions/9494601/why-is-functional-programming-good)への回答が重要な点です。 –

答えて

9

不変性(単一割り当てと呼ぶ)は、プログラムから「時間」変数を取り出すため、多くのことを簡素化します。例えば

あなたは

x = y 

を言うならば、数学であなたはどこでも、yためxを置き換えることができます。運用上のプログラミング言語では、この同等性が保証されているわけではありません。各コード行に関連する「時間」(状態)があります。この時間状態はまた、望ましくないドアを開いて、モジュール性と並行性の敵番号であるside effectsを残す。

詳細については、これを参照してください。http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-20.html#%_sec_3.1.1

+0

+1のSICPリンク。 :) –

3

Single Assignmentのので、副作用はとても最小限です。事実、Erlangの競合状態や副作用のあるコードを書くのは難しいです。これは、コンパイラが使用されていない変数、使用されていない用語、シャドウ変数(特に内部ではfuns)などを簡単に伝えるためです。

Erlangが得たもう一つの利点はReferential Transparencyです。 Erlangの関数は、グローバル変数ではなく、MACROSを除いて、渡された変数のみに依存します(実行時にマクロを変更することはできません)。

最後に、Erlang Movieを見た場合、Erlangに組み込まれたSophisticated Error Detection Mechanismは、Erlangでは変数が1回割り当てられるという事実に大きく依存します。

+2

しかし、Erlangの関数は完全に情報を透過的に伝達するわけではないことに注意してください。メッセージを別のプロセスに送ると、将来の関数の呼び出しの値を変更する副作用が生じる可能性があります。グローバル変数としては、プロセス辞書、ETSテーブルなどがあります。 –

+0

はい、Erlangは全く参考にならず、不変性は1つの副作用(つまり世界の状態を変える可能性のあるメモリの編集)のみを取り除きますが、一般的な副作用を制限するものではありません。 –

2

変数が値を保持すると、コードの理解とデバッグがはるかに簡単になります。コンカレント・プロセスでは、とにかく同じ種類の問題が発生するため、いずれの変数も潜在的にいつでもその値を変更することなく、複雑な問題が発生します。それを明示的に許可するだけで副作用をカプセル化すると考えてください。