質問: 私は関数型プログラミングをしたことがなく、今、C++で関数型プログラミングを学ぼうとしています。(そのようなレベルの人が質問しているとお考えください。) 手始めに高階関数やカリー化の実装を見たとき、便利ではあるし、いくつかは既に(関数型プログラミングとは意識せずに)使っていると感じました。 一方で、これから学ぶであろう多くの関数型プログラミング技法をC++で使ったとして、果たしてコンパイラの支援を良く受けることができるのだろうか?という疑問が出てきました。 関数型プログラミング言語として設計されたコンパイラなら、それに基づく多くの制約によってより強い支援が受けられると感じます(そうでない言語(コンパイラ)ならばメリットの一部しか享受できないのではないかと)。 ご意見をお聞かせいただければと思います。
回答: 関数型プログラミングと言っても、定義は様々だと思いますが、関数を第一級オブジェクトとして扱うのは共通だと思います。C++でも、関数を第一級オブジェクトとして使って、分かりやすいコードを書くのは可能です。 Cに`qsort`という関数があります。これは、クイックソートのアルゴリズムのうち、値を比較する部分を抽象化しオブジェクトにして、いろいろなデータ型に使えるようにしようとしているのですが、Cでは関数はポインタで渡すしかないため、利用が非常に面倒でバグも出やすくなっています。C++では、ラムダ関数やテンプレートのおかげで、このような場合も見やすくバグの出にくいコードが書けるようになっています。 その一方で、多くの関数型言語では関数に副作用がなく、それを利用した最適化、たとえば遅延評価のようなことをしています。しかしC++では、実引数の評価は、関数に渡される前にされます。したがって、C++で関数型言語と全く同じようにコードを書いてしまうと、パフォーマンスの悪化や意図せぬ無限ループなどの結果になりかねません。もちろん、テンプレートやクラスを駆使して、自分で遅延評価のメカニズムを作ることはできますが、それはコンパイラによる関数型プログラミングのサポートとは、とても言えないでしょう。 関数型プログラミングのうち、C++に合う部分だけを取り入れるのが、現実的だと思います。