関数型プログラミング【functional programming】
概要

中核となる概念の一つが「純粋関数」(pure function)で、同じ引数を与えれば必ず同じ値を返し、関数の外部にある変数を読み書きしない関数を指す。副作用(関数外への影響)がないため、テストが容易で並列実行しても結果が変わらない。もう一つの核心が「不変性」(immutability)で、一度作成したデータを書き換えず、変更が必要な場合は新しいデータを生成する。これにより、プログラム実行中のある時点での状態を追跡しやすくなる。
「高階関数」(higher-order function)も関数型プログラミングの基本要素であり、関数を引数として受け取ったり、関数を戻り値として返したりできる関数を指す。「参照透過性」(referential transparency )も頻出する概念で、式をその評価結果に置き換えてもプログラムの動作が変わらない性質を指す。これが保たれていると、コードの断片を切り出して個別に検証したり、コンパイラが最適化を適用したりしやすくなる。
関数型言語
関数型プログラミングを基本的なコード記述スタイルとするプログラミング言語を「関数型言語」という。「Lisp」や「Scheme」「Erlang」「F#」などがよく知られている。副作用を一切排し、数学的な関数のみでコードを構成する仕様の言語を特に「純粋関数型言語」と呼び、「Haskell」や「Elm」「Lean」などが該当する。
現代では、JavaScriptやPythonなど手続き型やオブジェクト指向型などを中心的なスタイルとする言語にも関数型プログラミング的な仕様が取り込まれている。例えば、配列やリストの操作では「map」や「filter」、「reduce」などの関数を用いて要素ごとの処理や集約を行うことができ、コードを宣言的に書くことができる。
また、高階関数の仕組みにより関数を一定の条件下で値として扱えるため、イベントハンドラやコールバック関数に動的に渡したり、処理の組み合わせを柔軟に構築したりできる。例えば、汎用のソート関数に開発者が自作した比較関数を渡し、その結果に基づいて配列をソートするといったコードをシンプルに記述することができる。副作用が少ない設計はテストやデバッグの際にも入力と出力の関係を明確に確認しやすい。