「純粋な機能」の「純粋」とは、「副作用のない」種類の純粋さを指します。人々が「純粋なオブジェクト指向言語」について話すときに使用される「純粋な」の意味とはほとんど関係がありません。これは単に、言語が純粋に (のみ) オブジェクトで操作することを意味します。
Java や C++ などの言語には、オブジェクトとあまり共通点のない値を明確に持っている言語があるため、オブジェクト指向言語を分類するために使用するのに、pure-as-in-only が妥当な区別であるからです。また、Python や Ruby などの言語もあり、すべての値がオブジェクトであると主張できます1 。
関数型言語の場合、言語が操作できるすべての値が関数であるという意味で「純粋関数型」である実用的な言語はありません。そのような言語でプログラミングすることは確かに可能です。ラムダ計算の最も基本的なバージョンには、関数ではないものの概念はありませんが、計算したいものを関数として表現する方法を考え出すことで、任意の計算を行うことができます。2
しかし、ラムダ計算の単純さとミニマリズムは、プログラミングに関することを証明するのに優れている傾向がありますが、実際には、そのような「生の」プログラミング言語で実質的なプログラムを書くのは厄介です。数値などの基本的なものの関数表現も、実際の物理マシンに実装するには非常に非効率になる傾向があります。
しかし、関数型のスタイルを奨励するがどこでも追跡されない副作用を許容する言語と、実際に関数が「純粋な」関数 (数学関数と同様) であることを強制する言語との間には、非常に重要な違いがあります。オブジェクト指向プログラミングは、不純な計算の使用に非常に強く結びついている3ため、この意味で純粋な実用的なオブジェクト指向プログラミング言語はありません。
したがって、「純粋な関数型言語」の「純粋」は、「純粋なオブジェクト指向言語」の「純粋」とは非常に異なるものを意味します。4いずれの場合も、「純粋対非純粋」の区別は、他の種類の言語に適用されるとはまったく興味のないものであるため、この用語の使用を標準化する強い動機はありません。
1私が知っているすべての「純粋なオブジェクト指向」言語には、選択すべき例外的なケースがありますが、それはあまり興味深いものではありません。あるクラスのインスタンスである言語では、オブジェクトの比喩がはるかに進んでいることは明らかであり、そのクラスは、オブジェクト以外のもの1
である言語よりもサブクラス化できます。1
2 とにかく、すべての計算は表現に関するものです。コンピュータは、数字やその他のことについて何も知りません。それらは、数値を表すために使用するビットパターンと、数値の操作に対応するビットパターンの操作を持っているだけです (そのように設計されているため)。
3これも基本的なことではありません。この意味で純粋な「純粋な」オブジェクト指向言語を設計できます。とにかく、OOコードのほとんどを純粋に書く傾向があります。
4これがわかりにくいと思われる場合は、「機能」、「オブジェクト」、および「言語」という用語が、他のコンテキストでも大きく異なる意味を持っていることを考えるかもしれません。