言い換えれば、言語を純粋にするものは何ですか?
たとえば、Smalltalkは純粋にオブジェクト指向言語と見なされます。HaskellとLispは、おそらく純粋関数型言語として知られています。
私たちが純粋と言うとき、それは彼らが他のプログラミングパラダイム(真実からはほど遠い)ができないことを意味しますか、それともその「純粋な」Xパラダイムで使用されるように設計されたことを意味しますか?
言い換えれば、言語を純粋にするものは何ですか?
たとえば、Smalltalkは純粋にオブジェクト指向言語と見なされます。HaskellとLispは、おそらく純粋関数型言語として知られています。
私たちが純粋と言うとき、それは彼らが他のプログラミングパラダイム(真実からはほど遠い)ができないことを意味しますか、それともその「純粋な」Xパラダイムで使用されるように設計されたことを意味しますか?
ピュアという言葉は、文脈によって意味が異なります。
Haskell が純粋な言語であると人々が話すとき、それは参照透過性を備えていることを意味します。つまり、プログラムの意味を変更することなく、任意の式をその値に置き換えることができます。たとえば、Haskell では次のようになります。
square :: Int -> Int
square x = x * x
main = print (square 4)
プログラムの意味を変更することなく、式square 4
をその値 (16) に置き換えることができます。一方、この Java コードでは次のようになります。
public int square(int x) {
System.out.println("Done!");
return (x*x);
}
public static void main(String [] args) {
System.out.println(square(4));
}
square(4)
プログラムの意味が変わるため、その値(16)に置き換えることはできませんDone!
-stdoutに出力されなくなります。Haskell では、関数が stdout への出力やメモリ位置の変更などの副作用を持つことは不可能であるため、参照透過性が強制されます。
この純粋の意味で、Lisp は純粋な関数型言語ではないことに注意してください。その関数には副作用があるためです (こだわりたい場合は、Haskell は が存在するため純粋な関数型言語ではありませんがunsafePerformIO
、あなたがその機能を使用した場合、地獄の厄介なサークルの1つに委託されます)。
もちろん、非純粋な言語で純粋なスタイルを採用することは常に可能であり、多くのプログラマーはプログラムの推論を容易にするためにこれを行います。純粋な言語の場合と同様に、参照の透過性がコンパイラによって強制されないだけです。
純粋関数型言語の例には、Haskell、Clean、およびMirandaが含まれます。非純粋な関数型言語の例には、OCaml、F#、およびSchemeが含まれます。
Smalltalk や Ruby が純粋なオブジェクト指向言語であると人々が話すとき、それらは、オブジェクトとプリミティブ値の間に区別がないことを意味します。Smalltalk と Ruby では、整数、ブール値、文字などの値も、メッセージを受信できる (Smalltalk) か、メソッドを持つ (Ruby) ことができるという意味で、オブジェクトです。たとえば、次のことができます。
1.to_s
つまり、整数1
を文字列に変換するメソッドを呼び出します。これを、オブジェクト (クラスのインスタンスであり、メソッドなどを持つことができる) とプリミティブ値 (メソッドを持つことができない 、 、 など) がある Java のような「不純な」OO 言語と比較しint
てdouble
くださいbool
。
オブジェクト指向言語が純粋である場合、「すべてがオブジェクトである」とよく言われますが、これは厳密には正しくありませんが (たとえば、if ステートメントはオブジェクトではありません)、「すべての値がオブジェクトである」と言うのは正しいです。 "。
純粋なオブジェクト指向言語の例には、RubyやSmalltalkなどがあります。不純なオブジェクト指向言語の例には、JavaやC++などがあります。
関数型言語の「純粋」という言葉は、間違いなく「ステートレス」であり、出力は状態に依存しません。
命令型言語の場合、x:= 0を割り当てますが、後で変数xの値を再割り当てできます。xの値は、現在の状態によって異なります。
ただし、純粋関数型言語の場合、f(x)= 1の場合、結果は常に1になります。