関数型言語 【functional language】 関数型プログラミング言語
概要
関数型言語(functional language)とは、プログラミング言語の分類の一つで、プログラム中の処理や制御を関数の定義と適用の組み合わせとして記述していくもの。そのようなスタイルでコードを記述することを「関数型プログラミング」(functional programming)という。プログラミング言語の多くは手続き型(procedural)あるいは命令型(imperative)と呼ばれる形式で、コンピュータに対する動作の指示を一つずつ順番に並べるスタイルでプログラムを記述していく。
これに対し関数型言語ではプログラムを、引数を入力として処理を行い、呼び出し元に返り値を出力する関数(function)の組み合わせとして記述する。手続き型でも関数の仕組みは利用できるが、関数型言語はほとんどありとあらゆるものを関数の定義と関数呼び出しを用いて実現する点で徹底している。
例えば、同じ処理を規定の回数や条件に従って繰り返す反復処理は、手続き型では一般的にfor文やwhile文などの制御構文を用いるが、関数型言語では関数の再帰呼び出しによって実装される。
関数型言語の主な特徴
関数型言語の多くに共通する特徴として、関数を変数と同じようにほとんどの操作が可能な第一級オブジェクト(first-class object)として扱う点があり、関数を引数や返り値とする「高階関数」(higher-order function)を定義することができる。
また、変数や関数の引数、返り値などを記述する際に、明示的にデータ型を宣言しなくても処理系が自動的に推定して適した処理を行ってくれる「型推論」(type inference)の機能もほとんどの言語が持っている。
参照透過性と純粋関数型言語
同じ入力には必ず同じ作用と出力を返す性質を「参照透過性」(referential transparency)と呼び、参照透過な記述のみで構成されたプログラムは、その評価や実行が以降の処理に思わぬ影響を及ぼす「副作用」(side effect)のないプログラムとなる。
関数型言語ではすべてを関数とすることで参照透過性を保ちやすくなっており、手続き型のプログラミングで開発者を悩ませ続ける副作用の問題を解消しやすい。ただし、外部との入出力など参照透過性を維持するのが本質的に難しい場面もあるため、多くの関数型言語は実用性との兼ね合いから参照透過的でない記述ができるようになっていることが多い。
参照透過的な記述しかできないようになっている言語を「純粋関数型言語」と呼び、Haskellがよく知られる。そうでないものは「非純粋関数型言語」と呼ばれ、Lisp、Scheme、ML(Meta-Language)、OCaml、Scala、Clojure、Erlang、F#など、よく知られる関数型言語のほとんどはこちらに分類される。
関数型言語と関数型プログラミング
関数型言語の研究や普及が進むに連れて、手続き型など他の種類のプログラミング言語にもその特徴が取り込まれるようになってきており、無名関数や高階関数、型推論などは多くの言語に実装されている。
「関数型プログラミング」とは関数型言語によるプログラミングだけでなく、手続き型言語などを用いて関数を組みわせてプログラムを構成する手法が含まれる。逆に、形式的には関数型言語を使っていても、代入など手続き型の特徴ばかりを用いてプログラムを構成していれば、それはもはや関数型ではなく手続き型プログラミングであると言える。