関数型言語
関数型言語（かんすうがたげんご、）は、以下に述べる関数型プログラミングを基本スタイルとして推奨する機能を持つプログラミング言語、関数型プログラミング言語の略称である。
何をもって関数型プログラミングとするか、ということに関して、関数型プログラミングのコミュニティ内でも正確な定義や合意というものは存在しない。したがって関数型言語の定義も明確な境界はない。ただし、手続き型プログラミングが命令実行の列としてプログラムを記述していくのに対し、関数型プログラミングは複数の式を関数の適用によって組み合わせていくプログラミングスタイルである。手続き型プログラミングの発端は計算機の命令 (instruction/command) や構造に密接にかかわりがある一方、関数型プログラミングは数学の理論を発端としている。
たとえば、1 から 10 までの整数を足し合わせるプログラムを考えるとき、手続き型プログラミングでは以下のようにループ文を使って一時変数に数値を足していく（一時変数の内容を書き換える）命令を繰り返し実行するという形を取る。
一方、関数型プログラミングでは、繰り返しには一時変数およびループを使わず、関数の再帰呼び出しを使う。ただし再帰呼び出しはスタックオーバーフローの危険性やオーバーヘッドを伴うため、注意深く使用しなければならない。通例、関数型言語では、末尾再帰呼び出し (tail-recursive call) の形で書かれた関数をループに展開するコンパイラ最適化により、スタックオーバーフローの危険性および再帰のオーバーヘッドを解消する。Schemeなど、関数型言語の中には末尾再帰呼び出しの最適化を仕様で保証するものもある。
また、関数型言語は文 (statement) よりも式 (expression) を中心とした言語仕様となっていることも特徴である。前述の例において、再帰関数codice_1を束縛するcodice_2は式である。また、条件分岐のcodice_3も式である。文よりも式で書けることが多いほうが都合がよい。
関数型言語は関数型プログラミングをサポートする言語ではあるが、手続き型プログラミングを行なうことも可能である。例えばF#では以下のようなPascal風の書き方もできる。
ただしHaskellのようにループ構文をサポートせず、従来の手続き型プログラミングが難しいケースもある。
逆に手続き型言語を使って関数型プログラミングを行なうことも可能であるが、末尾再帰呼び出しの最適化がサポートされるかどうかはコンパイラ次第である。
関数型プログラミングでは関数を第一級オブジェクトとして扱う。理論的な計算モデルとして第一級オブジェクトとしての関数を扱えるラムダ計算や項書き換えを採用している。
コンピュータプログラムは通例入力を受け取って何らかの処理を行ない、出力を返すことを目的として書かれる。数学の関数formula_1において、formula_2を入力、formula_3を出力と考えると、コンピュータプログラムはある種の関数であると考えることができる。ここで、入力や出力は記憶装置中のファイルのようなものばかりではなく、キーボードやポインティングデバイスによってユーザーから与えられる情報や、画面への表示といった入出力形態も考えられる。関数型プログラミングにおいては実際にそれらを扱う関数としてモデル化する。
純粋関数型言語では、参照透過性が常に保たれるという意味において、全ての式や関数の評価時に副作用を生まない。純粋関数型言語であるやは非正格な評価を基本としており、引数はデフォルトで遅延評価される。一方、は純粋だが正格評価を採用している。入出力などを参照透過性を保ったまま実現するために、たとえば ではモナド、 ではという特殊な型を通して一貫性のある表現を提供する。
非純粋関数型言語では、参照透過性を壊す、副作用があるような式や関数も存在する。などでデータ構造の破壊的変更などの副作用を多用したプログラミングを行うと、それはもはや手続き型プログラミングである。多くの場合、非純粋関数型言語の評価戦略は正格評価（先行評価）であるが、遅延評価する部分を明示することで、無限リストなどを扱えるものもある。
やなどの高水準言語には、関数型言語の機能や特徴を取り入れているものがあるが、変数の値やオブジェクトの状態を書き換えるプログラミングスタイルを通常とするため、関数型言語とは分類されない。一方は、その多くが副作用のある式や関数が多数あり、手続き型スタイルでのプログラミングがされることも多いが、理論的なモデル（「純」）の存在や副作用を使わないプログラミングが基本であること、ないし主には歴史的理由から、関数型言語だとされることが多い。なお、では「手続き」と呼ばれるような値を返さないサブルーチンを、C言語では「関数」と呼んでいるが、これは単にルーチンについて、細分類して別の呼称を付けているか、細分類せず総称しているか、という分類と呼称の違いに過ぎず、「は手続き型言語で、C言語は関数型言語」という一部の書籍に見られる記述は明確に誤りである。また、やなどでは、「自明な値(例えばcodice_4)を返す」と、値を返さない（codice_5など）は違うものであり、後者は停止しないか例外を出す(そのため結果がない)ようなプログラムを表す。
なお、「関数型言語である」と「関数型プログラミングをする」は同値ではなく、関数型には分類されない言語で関数型プログラミングをすることや、関数型プログラミングを基本とする言語の上で他のパラダイムを実現する例もある。
データフロープログラミング言語も関数型言語と共通した特徴を部分的に持つ。
は、その基本機能のモデルとして関数型の純を持つなどといった特徴がある、最初の関数型言語である。今日広く使われている方言のうち特には関数型としての特徴が強い。
現代的な関数型プログラミング言語の祖としてはアイディアが1966年に発表されたが挙げられるが、1970年前後までは関数型プログラミング言語の歴史はの発展が主である。1970年代にプロジェクトが開始されたのための言語としてMLが作られている。
またにおいて、変数のスコープに静的スコープを採用したが誕生したのが1975年である。
1977年、の設計とバッカス・ナウア記法の発明の業績でこの年のチューリング賞を受賞したジョン・バッカスは、と題した受賞記念講演で関数型プログラミングの重要性を訴えた。講演ではFPという関数型プログラミング言語の紹介もした（サブタイトルの後半の「プログラムの代数」はこれを指す）が、これは（特に、高階関数の意味がある記号（の用語ではオペレーター（作用素）という））の影響を受けている。
バッカスのは広く使用されることはなかったが、この後関数型プログラミング言語の研究・開発は広まることとなった。1985年にが登場した。1987年に、遅延評価の純粋関数型プログラミング言語の標準の必要性が認識されの策定が始まった。1990年に 1.0仕様がリリースされた。同じく1990年にはの標準であるもリリースされている。
は1987年に登場したが、発展の過程での影響を受けている。1996年に、ML処理系のひとつであったにオブジェクト指向を追加したが登場した。また日本ではSMLに独自の拡張を施したが開発されている。
21世紀に入ると、仮想マシンや共通言語基盤（）をランタイムとする関数型プログラミング言語を実装しようという動きが現れ、・・などが登場した。
従来の手続き型と分類されるプログラミング言語においても、関数型プログラミングを行ないやすくなる機能を備えているものもある。C言語およびC++は関数へのポインタをサポートし、関数をオブジェクトのように扱うことができるが、関数ポインタによって第一級関数をサポートしているとみなされてはいない。なお、C# 3.0、C++11、Java 8など、後発の規格においてラムダ式（無名関数）をサポートするようになった言語もある。