関数型プログラミング
関数型プログラミングは、プログラミング言語の記述方法(パラダイムと呼ぶ)の一種である。
他にはC言語が属する構造的/手続き的プログラミングであったり、オブジェクト指向プログラミングなどが存在する。
根本の思想
オブジェクト指向が関数をデータとして扱うならば、関数型はデータを関数として扱っている。
記述方法
関数型プログラミングでは、「データに何らかの処理を加える」ことを連続して行っていきます。
例えば、あるデータに処理Aを行い、処理Bを行い、処理Cを行う、といったコードを書くときは
まず任意のデータに処理Aを行った値を返す関数faを作ります。このとき元のデータには変更を加えません。同様の関数としてfb、fcを作ります。
こうすると、ほしいデータdataは処理前のデータdがあったとしたらdata = fc(fb(fa(d)))で表されます。美しいですね!
Haskellなどでは関数合成演算子.を使うことで更に簡潔に書ける。(Haskellではdataは予約語なので変数名には多分できないが)
data = fc . fb . fa d
この記述の優れた点
同じ処理を行う際に関数を再利用できる
機能を分割しているのでそれぞれでテストでき、デバッグが簡単になる
副作用を持つ関数とそうでない関数を分離できる
table:関数型プログラミングを行うことのできる言語の例
言語 特徴
Haskell 副作用を許さない純粋関数型言語で、副作用はモナドに包んで利用する。遅延評価。
OCaml シンタックスはHaskellに似ている(MLからHaskellが派生している)が正格評価で副作用も許される。
Lisp 動的言語で自身のコードをデータ構造として扱うことができ、自己書換プログラムが書ける。
Erlang 動的言語で強力な並行処理のサポートを備えている。
Scala オブジェクト指向と関数型を併せ持つ思想の言語。JVMで動作するためJavaの資産を利用可能。
F# .NET CoreというVMで動作する、MS製でML系の言語。C#の資産を利用可能。
Idris Haskellに似たシンタックスで原則正格評価。依存型という先進的な言語機能が備わっている。