私は現在Erlangをマスターしようとしています。これは私が調べた最初の関数型プログラミング言語であり、Erlangではあなたが行う各割り当てが単一の割り当てであることに気づきました。そして明らかに、Erlangだけでなく、他の多くの関数型プログラミング言語では、割り当ては単一の割り当てによって行われます。
なぜ彼らがそのようにしたのか、私は本当に混乱しています。単一の割り当ての目的は正確には何ですか?それからどのようなメリットが得られますか?
私は現在Erlangをマスターしようとしています。これは私が調べた最初の関数型プログラミング言語であり、Erlangではあなたが行う各割り当てが単一の割り当てであることに気づきました。そして明らかに、Erlangだけでなく、他の多くの関数型プログラミング言語では、割り当ては単一の割り当てによって行われます。
なぜ彼らがそのようにしたのか、私は本当に混乱しています。単一の割り当ての目的は正確には何ですか?それからどのようなメリットが得られますか?
不変性(いわゆる単一代入)は、プログラムから「時間」変数を取り除くため、多くのことを単純化します。
たとえば、数学では、
x = y
どこでも、にx
置き換えることができます。y
運用プログラミング言語では、この同等性が維持されることを保証できません。コードの各行に関連付けられた「時間」(状態)があります。この時間の状態はまた、モジュール性と並行性の敵のナンバーワンである望ましくない副作用への扉を開いたままにします。
詳細については、こちらをご覧ください。
シングルアサインメントのため、副作用はごくわずかです。実際、Erlangで競合状態や副作用のあるコードを書くのはとても難しいです。これは、コンパイラが未使用の変数、使用されていない作成された用語、シャドウ変数(特に内部funs
)などを簡単に通知するためです。
これでErlangが得たもう1つの利点は、参照透過性です。Erlangの関数は、渡された変数のみに依存し、グローバル変数には依存しませんMACROS
(ただし、マクロは実行時に変更できません。定数です)。
最後に、 Erlangに組み込まれているErlangムービーを視聴した場合Sophisticated Error Detection Mechanism
、Erlangでは変数が1回割り当てられるという事実に大きく依存しています。
変数に値を保持させると、コードの理解とデバッグがはるかに簡単になります。並行プロセスでは、とにかく同じ種類の問題が発生するため、変数がいつでもその値を変更する可能性がなくても、とにかく十分な複雑さがあります。明示的な場合にのみ副作用を許可することにより、副作用をカプセル化するものと考えてください。