|
|
関数型言語関数型言語(かんすうがたげんご)は、純粋関数型言語と非純粋関数型言語の総称。 ラムダ計算の概念をプログラミング言語として体現したものである。すべての計算は関数の評価によって行われる。[1]
[編集] 概要関数型言語は、広い意味ではファーストクラスの関数オブジェクトを持つ言語である。また、純粋関数型言語では、全ての関数が副作用を持たない。関数型言語の多くは、カリー化、遅延評価などの機能を備えている。また、静的型付けの物の多くは型推論の機能を持つ。 引数の評価が関数の実行より先に行われることを正格であるといい、そのような性質を正格性と呼ぶ。正格性に関して非正格である言語は通常、デフォルトでの遅延評価を採用している。純粋関数型言語は遅延評価を標準とし、非純粋関数型言語は正格評価(先行評価)を標準としている。 [編集] 非純粋関数型言語Schemeを含むLISPは関数型言語に分類されるが、変数の書き換えが可能なため、厳密な定義ではこれらは関数型言語の機能を備えた手続き型言語であるとされる。純粋関数型言語は宣言型プログラミングの一種であるのに対して、非純粋関数型言語は命令型プログラミングの一種である。 非純粋関数型言語の多くが、プロミスを作成して、評価を後回しにする、遅延評価を行える。 [編集] 純粋関数型言語純粋関数型言語はチューリングマシンをベースとしたCやJavaなどの手続き型言語と違い、状態という概念をもたない。そのため参照透過性が保たれる。簡潔にいえば、変数がなく定数しかない。 純粋関数型言語であってもI/O処理を行う際など、必然的に副作用を伴う事になるが、「コンピュータの現在の状態から次の状態を返す関数」などの手法により状態を関数に折り込んでしまうのが普通である。Haskellの場合モナドを使い、Concurrent Clean の場合、環境情報を載せたものを順次渡していく。 [編集] 代表的な関数型言語分類は通常の場合である。特に正格性と遅延評価に関しては構文などを用いて指定できる場合がある他、コンパイラが最適化する場合もある。 [編集] 純粋関数型言語
[編集] 非純粋関数型言語[編集] その他の関数的性質を持つ言語[編集] 関連項目[編集] 外部リンク[編集] 参考文献
|