関数型プログラミング
関数型プログラミングについて
関数型プログラミングとは
関数型プログラミングとは、関数に引数を作用(applicate)させて計算を行うプログラミングパラダイムです。
ここでいう「関数」とは、「数学における関数」であり、手続き型プログラミングなどにおける関数ではありません。
数学的な関数とは、ある入力値が決まると出力値が一意に決まるという特徴があります。
関数型プログラミングの特徴
関数型プログラミングは、中間結果を保管する一時変数を使用せずに、プログラムへの入力に対して実行される操作のみを記述します。
関数は同じ入力値に対して常に同じ出力値を返し、同じ入力に対して異なる出力をするような内部状態を持たないようにします。
関数型プログラミング言語では、関数を機能の単位として、関数を組合わせることで全体機能を記述していきます。
できるだけ状態の変更を避け、関数の間を流れるデータだけを扱うようにします。
関数型プログラミングは宣言型プログラミングの一種です。
関数型プログラミングは、関数を宣言していくことでプログラムを作成します。
このことから、一般的に関数型プログラミングは宣言型プログラミングとほぼ同義と見なされます。
データや変数に対して命令を与えることは許されないので、命令型プログラミングと対立の概念となります。
関数型プログラミングの関連概念
参照透過性(referential transparency)とは
参照透過性とは、同じ引数が与えられると、必ず同じ値を返すという特徴をいいます。
参照透過性が高いとは、関数がいつどこで呼び出されようと、入力が同じであれば常に得られる結果が同じになる、ということを意味します。
つまり、関数の評価結果が状態変化の副作用に左右されることが少ないということです。
副作用とは
副作用とは、プログラムの内部状態が変更されたり、返り値に現れない変更が行われることをいいます。
具体例としては、破壊的代入(変数の書き換え)などが挙げられます。
「副作用を無くす」ということは、以下の2点を満たすことになります。
- 変数は一度値を与えられたら変更されない。
- 各関数の出力はその入力にしか影響を受けない。
非純粋関数型言語と純粋関数型言語
非純粋関数型言語とは、書き換え可能な変数など副作用のある機能も一部合わせ持っている言語です。
LISPやScheme、ML、OCaml、Scalaなどが非純粋関数型言語として挙げられます。
副作用を一切排除した言語は純粋関数型言語は呼ばれ、Haskellなどが挙げられます。
高階関数(higher order function)
高階関数とは、関数値を引数にとったり戻り値として返したりすることができる関数のことをいいます。
関数をオブジェクトとして扱い、値と同じように変数に代入したり、関数の引数として渡したり、戻り値として返したりすることができます。
Haskellでは高階関数を利用できる仕組みが用意されています。