「純粋な」関数型言語はすべて強い型付けです。それらの間にリンクはありますか?
3 に答える
「純粋」関数型言語は、参照透過性を強制するものです。強制は静的(型システムを介して)である場合もあれば、動的(実行時の失敗など)である場合もあります。「強く型付けされた」と言うときは、「静的に型付けされた」という意味だと思います...
型付きの純粋関数型プログラミングが出現したコミュニティは、ランタイムの失敗を減らし、型の強制なしでプログラミングをより安全に追加して純粋にするために別々に発行されます-ランタイムの失敗はまだオプションです-は不調和です。
したがって、タイプとエフェクトのタイピングがデフォルトで純粋であることがわかるのは当然のことです。それはすべて、実行時の失敗を減らすことです。
自明ではない関数型プログラミング手法では、一流以上の関数を多用します。ファーストクラス関数はクロージャとして実装されます。ファーストクラスの関数とクロージャの重要な使用は、ガベージコレクションがある場合にのみ適切です。効率的で信頼性の高いガベージコレクションには、メモリの安全性が必要です(これは「強く型付けされた」という意味だと思います)。さあ、行きます。
純度はそれほど重要ではありません。
Mercury (関数型プログラミングを行うことができますが、より純粋な論理プログラミング言語です) には、実際には明示的な静的純度システムがあります。すべての述語または関数は、静的に純粋または不純 (または半純粋ですが、詳細には触れません) であることがわかっています。純粋な関数 (デフォルトは純粋) 内に非純粋な関数を呼び出すと、コンパイル時にエラーが検出されます。
また、すべての式/変数の型がコンパイラによって静的に認識され、コンパイル時に型エラーが検出される静的型システムも備えています。ただし、型システムは純粋性システムから完全に独立しています (任意の型の純粋関数、非純粋関数、および半純粋関数を使用できるという点で)。
したがって、同じ静的純度システムを備えた別の言語を想像できますが、式/変数の型が静的に知られておらず、実行時に動的に変化する可能性があります。そのような言語が PHP の意味で「弱い型」を持っていると想像することもできます (つまり、言語は、値の型では意味をなさない操作を実際に実行できるように値を変換しようとします)。 C (つまり、ある型の値を別の型であるかのように言語が扱う変数に格納するように言語を納得させることができます)。
純粋性が静的に認識されていなくても、実行時に強制される言語を想像することもできます。言語は、それが純粋な呼び出しであるかどうかを追跡し、そうである場合は、純粋でないプリミティブ操作への呼び出しを拒否するなどのことを行う必要があります。
そういう意味では、厳密な型付けと純粋なプログラミングの間に関連性はありません。
ただし、(Scala のように単純に純粋性を奨励するのではなく) 実際に純粋性を強制する言語は、伝統的に静的解析によってこれを達成してきました。実際、純粋なコードを使用する動機の 1 つは、恣意的に不純なコードよりも静的解析の影響を受けやすいということです。人為的な例として、ブール値の引数を取り、何かを返す関数は、それが純粋な場合、最大で 2 つの結果のうちの 1 つを返すことが知られています。それが知られていない場合純粋であるためには、言語は、呼び出しごとに異なるものを返す可能性があると想定する必要があります..そして、コードの静的分析に興味があり、純粋さを強制するためのこの静的分析システムがある場合は、それを作成することもできます.型安全性も強制します。したがって、純粋性を強制するが強力な静的型システムを持たない言語に対する「呼び出しはそれほど多くない」だけです。実際に存在する言語については知りません (私の知る限り、純粋性を強制する言語はそれほど多くありません)。