今回は、関数型プログラミングに関する内容だね!
関数型プログラミングの特徴について学べるんですよね!
・関数型プログラミングの特徴
・関数型プログラミングの型
前回は関数型プログラミングのすごさを感じてもらうために、関数型プログラミングを採用するメリットについて説明しました。そこで今回は、前回紹介した関数型プログラミングのメリットにつながる特徴と、加えて、関数型プログラミングが扱う型について紹介したいと思います。
関数型プログラミングでは、整数や文字列などの対象(第一級の対象)と同じように、関数を第一級の対象として扱います。したがって、関数を引数として受けとったり、結果として返したりする高階関数を定義することができます。高階関数を使えば、よく使われる計算パターンをシンプルに記述することができるため、プログラムをきれいに書き表すことができます。複雑な計算も高階関数の組み合わせによって処理することができるため、プログラムのモジュール性(独立した部品から組み立てられている傾向)が高くなります。
関数型プログラミングが扱う純粋な関数は、プログラムの他の部分に影響(副作用)を与えず、また、他の部分から影響を受けることもありません。つまり、関数はどこで実行されてもいつでも同じ結果を出してくれます。これを参照透明性といいます。参照透明性により、関数型プログラムを数学的に扱うことが可能になります。具体的には、プログラム変換や解析を簡単に行うことができます。
関数型プログラム言語の中には、Haskell のように遅延評価が可能なものがあります。遅延評価とは、関数の呼び出し時に、引数の計算が必要なときだけ計算されるという評価の仕方です。遅延評価を使えば、宣言的にプログラムを書くことができ、たとえば、無限データを扱うことができます。また、巡回定義を含んだプログラムを無限ループを起こさずに定義のまま実行することが可能となります。
型の概念は、命令型プログラミングでもありますが、特に関数型プログラムは型との相性がよいといわれています。
基本的なデータ型には、整数型、実数型、文字列型、真偽値型などがあります。関数型プログラミングでは、プログラムの変数や式にデータ型を付与します。これを型付といい、型付は静的な型付と動的な型付で構成されています。静的な型付では、プログラムの実行前に型が定まり、動的な型付では実行後に型が定まります。間違いを含むプログラムにおいては、型が定まらないことが多いので、プログラムを実行する前に型のエラーが見つかれば、プログラムを実行せずに間違いを見つけることができます。
関数にも型を付与します。具体的には、関数の入力と出力の型を定めるということです。A というデータの型をもらって B という型のデータを返す関数の型は、A → B と書きます。A → B もデータ型の一種になります。 例えば 整数をもらって整数を返す関数の型は、整数の型を i とすれば、i → i で表せます。
また、関数型プログラミングでは、高階関数が許されていたので、A → B を型とする関数をもらって、C という型のデータを返す関数にも型を持たすことができて、それは、(A → B) → C と表せます。逆に、C というデータの型をもらって、A → B を型とする関数を返す関数の型は、C → (A → B) と表すことができます。
本記事では、関数型プログラミングの特徴と型について説明しました。次回は、関数型プログラミングの基本である、型付ラムダ計算を解説しようと思います。お楽しみに!
各種お問い合わせ