そもそも「関数」とは? 関数ならC言語にもあるのでは

 関数型でいう「関数」とは、C言語における関数やC++/Javaでいうメソッドとは微妙に異なる。関数型における「関数」とは、その出力が入力だけで一意に決まるものを指す。一方、C言語など一般的なプログラミング言語では、関数の出力は必ずしも入力だけでは決まらない。関数の内部にある変数の値、システム全体の状態などによって、同じ入力を与えたとしても出力は変わってしまうものが多い。結果として、関数の動作は複雑になり、コードの可読性も悪化、テストもしにくくなる。

 関数型でいう「関数」は、プログラムをよりシンプルにする仕組みであり、関数型プログラミング言語では、この「関数」を主体にしたプログラミング・スタイルを支援する仕組みが備わっている(関連記事)。手続き型のプログラミング言語でも、状態などを入力に含めて記述すれば、関数型でいう「関数」と等しくなる。

[画像のクリックで拡大表示]

どんな言語がある?

 関数型プログラミング言語には、いくつかの系統がある。本流をなすのはJavaなどにも採用されている「静的型付き」の特徴を持つ系統だ。1970年代に「ML」という言語で初めて導入された「型推論」という仕組みにより、静的型付き言語でありながら、型を記述しなくて済むようになった。プログラマーの代わりに、コンパイラーが型を推論するのである。型を随所に用いることで、プログラムの実行時に発生するエラーを防ぎやすく、なおかつ型推論の仕組みにより、軽量言語並みの手軽さでコードを記述できる。

 HaskellやScalaなど、現代の静的型付き関数型プログラミング言語はすべて型推論を導入している。「LISP」は1950年代後半に生まれ、関数型の源流となった言語だが、Rubyなどの軽量言語と同じ「動的型付き」言語であり、現代の関数型プログラミングの土台となっている静的型付きではない。このため、HaskellやScalaなど現代的な関数型プログラミング言語と同類にはみなしにくいとの意見が多い。

[画像のクリックで拡大表示]