関数型言語 【functional language】 関数型プログラミング言語

概要

関数型言語(functional language)とは、プログラミング言語の分類の一つで、プログラム中の処理や制御を関数の定義と適用の組み合わせとして記述していくもの。そのようなスタイルコードを記述することを「関数型プログラミング」(functional programming)という。

プログラミング言語の多くは手続き型(procedural)あるいは命令型imperative)と呼ばれる形式で、コンピュータに対する動作の指示を一つずつ順番に並べるスタイルプログラムを記述していく。

これに対し関数型言語ではプログラムを、引数入力として処理をい、呼び出し元に返り値出力する関数function)の組み合わせとして記述する。手続き型でも関数の仕組みは利用できるが、関数型言語はほとんどありとあらゆるものを関数の定義と関数呼び出しを用いて実現する点で徹底している。

例えば、同じ処理を規定の回数や条件に従って繰り返す反復処理は、手続き型では一般的にfor文while文などの制御構文を用いるが、関数型言語では関数の再帰呼び出しによって実装される。

関数型言語の主な特徴

関数型言語の多くに共通する特徴として、関数変数と同じようにほとんどの操作が可能な第一級オブジェクト(first-class object)として扱う点があり、関数引数返り値とする「高階関数」(higher-order function)を定義することができる。

また、変数関数引数返り値などを記述する際に、明示的にデータ型を宣言しなくても処理系が自動的に推定して適した処理をってくれる「型推論」(type inference)の機能もほとんどの言語が持っている。

参照透過性と純粋関数型言語

同じ入力には必ず同じ作用と出力を返す性質を「参照透過性」(referential transparency)と呼び、参照透過な記述のみで構成されたプログラムは、その評価や実行が以降の処理に思わぬ影響を及ぼす「副作用」(side effect)のないプログラムとなる。

関数型言語ではすべてを関数とすることで参照透過性を保ちやすくなっており、手続き型プログラミングで開発者を悩ませ続ける副作用の問題を解消しやすい。ただし、外部との入出力など参照透過性を維持するのが本質的に難しい場面もあるため、多くの関数型言語は実用性との兼ね合いから参照透過的でない記述ができるようになっていることが多い。

参照透過的な記述しかできないようになっている言語を「純粋関数型言語」と呼び、Haskellがよく知られる。そうでないものは「非純粋関数型言語」と呼ばれ、LispSchemeML(Meta-Language)、OCaml、Scala、Clojure、Erlang、F#など、よく知られる関数型言語のほとんどはこちらに分類される。

関数型言語と関数型プログラミング

関数型言語の研究や普及が進むに連れて、手続き型など他の種類のプログラミング言語にもその特徴が取り込まれるようになってきており、無名関数高階関数、型推論などは多くの言語に実装されている。

「関数型プログラミング」とは関数型言語によるプログラミングだけでなく、手続き型言語などを用いて関数を組みわせてプログラムを構成する手法が含まれる。逆に、形式的には関数型言語を使っていても、代入など手続き型の特徴ばかりを用いてプログラムを構成していれば、それはもはや関数型ではなく手続き型プログラミングであると言える。

(2019.7.24更新)

他の辞典による解説 (外部サイト)

この記事の著者 : (株)インセプト IT用語辞典 e-Words 編集部
1997年8月より「IT用語辞典 e-Words」を執筆・編集しています。累計公開記事数は1万ページ以上、累計サイト訪問者数は1億人以上です。学術論文や官公庁の資料などへも多数の記事が引用・参照されています。
ホーム画面への追加方法
1.ブラウザの 共有ボタンのアイコン 共有ボタンをタップ
2.メニューの「ホーム画面に追加」をタップ
閉じる