数学では、変数は任意の数をそこに置くことができることを意味し、方程式は依然として真です
root(square(x)) = abs(x)
プログラミング言語では、そうではありません。変数は変更できます。Pythonの場合:
y = (x**2)**.5
x *= 2
assert y == abs(x)
最後の行のxは同じではないため、例外が発生します。
不変変数を使用するプログラミング言語はありますか?
数学では、変数は任意の数をそこに置くことができることを意味し、方程式は依然として真です
root(square(x)) = abs(x)
プログラミング言語では、そうではありません。変数は変更できます。Pythonの場合:
y = (x**2)**.5
x *= 2
assert y == abs(x)
最後の行のxは同じではないため、例外が発生します。
不変変数を使用するプログラミング言語はありますか?
回答:
「プログラミング言語は数学で変数を使用しますか?」というタイトルの質問に答えるために:C、C#、Java、C ++、およびその他のCスタイル言語は、数学で使用される方法で変数を使用します。
=の代わりに==を使用するだけです。
あなたのオリジナルを
root(square(x)) = abs(x)
次に、構文を変更することなく、それを直接C#に変換できます。
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
これは、xの2乗が使用しているデータ型の最大値よりも小さい限り、xの値に対してtrueと評価されます。 (Javaはかなり似ていますが、Math名前空間は少し違うと思います)
この次のビットは、C#でのコンパイルに失敗します。これは、ある操作の戻り値を別の操作に割り当てることができないことをコンパイラが十分に理解しているためです。
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
不変性はこれとは関係ありません。不変の言語で値を割り当てる必要がありますが、=を演算子として使用して特定の言語がこれを行うことを選択する可能性は完全にあります。
ポイントをさらに証明すると、xの正当な値を使い果たしてオーバーフロー例外が発生するまで、このループが実行されます。
while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
{
++x;
System.Console.WriteLine(x);
}
これが、数学者が割り当てに=を使用することを嫌う理由です。それらを混乱させます。これはあなたを混乱させたと思います。例を挙げてください
y = (x**2)**.5
x *= 2
assert y == abs(x)
これを代数にすると、次のようになります。
abs(2x)= root(x ^ 2)
もちろん、これは0以外の値には当てはまりません。不変性は、元の方程式の左辺と右辺の評価の間に余分なステップを追加するときにxの値を変更するエラーからあなたを救います。実際に式を評価する方法は変わりません。
Haskellなどの純粋に機能的なプログラミング言語は、不変の変数を強制します。ただし、変数ではなく識別子と呼びます。
クラスの更新を許可しないことにより、Pythonで不変性をシミュレートすることもできます。前述のように、ほとんどの純粋な関数型プログラミング言語は不変性を強制します。ClojureはJVMプラットフォームに最近追加されたものです(ClojureはLISPの方言です)
ではScalaの(また、JVMの言語)OOとFPサポート変数の単一化で宣言されたval
不変です。Scalaの表現力とOO / FPハイブリッドサポートにより、ScalaはMathematicaに似た外観になります。(Akkaは、Erlang OTPとSTMなどのClojure機能をScalaやJavaに追加するフレームワークです。)LACASAは、Scalaでオブジェクト機能の規律を実施し、一意のオブジェクト参照を提供するために、型システムとプログラミングモデルを追加します。(コード)(理論的背景)
Javaでは、宣言された変数final
は不変であり、Google GuavaなどのJava ライブラリにはコレクションの不変ライブラリが含まれています。Java String
も常に不変です。