関数型プログラミングとは?
関数型プログラミングは、関数の組み合わせでコーディングするプログラミング方法です。問題の性質を数学的な表現で記述できるため、研究目的での利用に適しています。
JavaやJavaScript、Ruby、PHPなどのよく知られたプログラミング言語による記述は命令型プログラミングです。コンピュータに実行させたい処理を命令の列として記述します。
命令をひとまとめにした手続きをつないでプログラミングすることが多く、この場合には手続き型とも呼ばれます。これらと対照的とされるのが宣言型と呼ばれるプログラミング手法で、問題の性質を記述することで答えを出力させます。
関数型プログラミングは宣言型プログラミングの一種です。
関数型プログラミングのメリット
関数型プログラミングにはどのようなメリットがあるのでしょうか。
コードがシンプルでわかりやすい
命令型プログラミングでは、一連の手続きをつないでコーディングします。そのため、コードの意味を理解するには処理の流れを把握しなければなりません。
それに対して、関数型プログラミングは簡潔な関数の組み合わせでプログラミングします。個々の関数は独立しており、実行中の処理の影響を受けません。そのため、コード全体がシンプルで人が見て分かりやすく、保守性や再利用性に優れています。
テストを実施しやすい
関数型プログラミングで記述されたコードは、同じ入力に対し常に同じ結果を返します。命令型プログラミングでは変数の値が動いていくことなどによって結果が変わりますが、関数型では実行中に変数の値の変更が起きません。
そのため、入力と出力の関係をシンプルにとらえることができ、テストが簡単です。
プログラミングの副作用が発生しにくい
プログラミングの副作用とは、入力後の処理により、予測しにくい結果が出力されることです。
命令型プログラミングでは、命令の重ね方によって思わぬ処理が生じ、副作用が発生することがあります。処理の結果がそれ以前の処理の影響を受けやすいためです。前述した変数の値が動くことも副作用の原因になります。
それに対し、関数型プログラミングは個々の関数が独立しているため、他の処理の影響を受けません。したがって、副作用のリスクも小さくなります。
関数型プログラミングのデメリット
関数型プログラミングには以下のデメリットがあります。
- 環境に左右されやすい
- 関数型プログラミングは命令型プログラミングと異なり、言語の機能を拡張できます。文法を変更することも可能です。しかし、ある環境で成功したカスタマイズが他の環境でも通用するとは限りません。
- 環境を変えた途端、プログラムが動作しなくなる可能性があります。
- パフォーマンスチューニングが難しい
- 関数型プログラミングは、コンピュータが実行する個々の処理の内容を把握しづらいのが難点です。そのため、チューニングは難しく、不自然なコードになりがちです。
- 前の処理を引き継ぎにくい
- 命令型プログラミングは一連の手続きの流れによって処理を記述します。そのため、前の処理で生じた値を、次の処理で使うのも簡単です。しかし、関数型プログラミングはそれぞれの処理が独立しているため、処理の引き継ぎが苦手です。
関数型プログラミングで用いる開発言語の分類
関数型プログラミングの開発言語は以下の2種類に分類されます。
純粋関数型言語
純粋関数型言語とは、すべての処理を純粋関数のみで記述する言語です。HaskellやClean、Miranda、Idrisなどが代表的です。同一入力に対し同一の作用・出力を返し、副作用が生じるリスクを最小限に抑えられます。完全な意味での関数型プログラミングが実現します。
ただし、どうしても変数を使う必要があるなど、純粋関数のみでコーディングするのが難しいケースも少なくありません。
非純粋関数型言語
非純粋関数言語は、関数型言語でありながら命令型言語の特徴を併せ持つ言語です。OCamlやScala、Scheme、Unlambdaなど、有名な関数型言語の多くは非純粋関数型言語に該当します。
純粋関数型言語と比較し、副作用が生じるリスクは大きくなります。しかし、その分柔軟性が高く、実用性に秀でているのが特徴です。
関数型プログラミングを理解して適した手法を実施しよう!
関数型プログラミングは関数の組み合わせでプログラミングを行う手法です。これまでご紹介してきたように以下のメリットがあります。
- ■コードがシンプル
- ■テストが簡単
- ■副作用が生じにくい
一方、環境の影響を受けやすいやチューニングが難しいといったデメリットもあります。ぜひ自社の課題や状況にあわせて関数型プログラミングを利用してみてください。