2012年9月初頭、東京・某所で開催された「函数プログラミングの集い 2012」というイベントに参加した。

 このイベント、文字通り、「Haskell」や「Scala」「OCaml」「F#」「Erlang」といった関数型プログラミング言語に関するイベントなのだが、その午前中の講演を聞いて、筆者は少々面食らった。

 関数型プログラミング言語などの研究者である電気通信大学 准教授の中野圭介氏による講演だったのだが、同氏は講演が始まるや否や「これから『爆弾』を投下します」と前置きし、こう述べたのだ。

 「『関数型言語』を使ってはいけない」と。

 関数型プログラミングに関するイベントで、いきなり「使うな」という発言は、確かに衝撃的である。筆者だけかもしれないが、この発言の後、一瞬、会場が凍り付いたようにも見えた。一体、どういうことか。

 実はこの発言、「使うな」という部分に重点があるのではなく、「関数型言語」という言い回しにポイントがある。同氏の発言を言い換えると、「『関数型言語』という表現を使ってはならない」ということなのだ。「『関数型言語』という表現は教科書にもよく出てくるし、専門の研究者もつい口にしてしまう。しかし、実は正しい表現ではない」(中野氏)のだという。

 なぜ「関数型言語」と言ってはいけないか。中野氏の説明を、以下で筆者なりの解釈で簡単にご紹介させていただく。

「関数型」とは「言語」ではなく「プログラミングスタイル」への形容

 そもそも、関数型とは「言語」を形容する言葉としては適切ではない。関数型とは「プログラミングスタイル」を修飾する言葉である。具体的には、プログラム中の記述のほとんどが「関数」で占められているスタイルを指す。冒頭に挙げたHaskellやScala、OCaml、F#、Erlangといった言語は、関数型プログラミングがしやすい設計になっており、自然とその記述は「関数」を用いたものが多くなる。

 ただし、関数型プログラミング自体は、「関数」が主体になっていれば成立するため、一般に「関数型プログラミング言語」と認知されている言語以外でも、実は「関数」を用いて記述することは原理的には可能だ(効率的に記述できるかどうかは別として)。中野氏によれば、「関数型言語」という言葉は、こうした関数型プログラミングをしやすいという意味以外で使うべきではないとのことだ。

 ITproの読者の方々であれば今更説明は不用かもしれないが、改めて確認しておくと、そもそも関数型プログラミングでいう「関数」とは、C言語やJavaなどでいう関数とは意味が異なる。関数型プログラミングでいう「関数」とは、「入力が同じであれば、出力も常に同じ値になる」ものを指す。C言語などでいう関数は、同じ入力を与えたとしても関数内部の状態やシステム全体の状態によって得られる出力は変わってしまう。例えば、あるJavaの関数(メソッド)が内部で変数を保持し、出力に関与していれば、たとえ同じ入力を与えたとしても、関数の出力値はその変数の値に依存して変わってしまう。このような関数は、関数型プログラミングでいう「関数」には相当しない。