関数型プログラミング脳を作るには

 おそらく Scala(に限らずだと思うけど)を身につけるにあたって、Java プログラマが越えなければならない大きな壁の一つは「いかに関数型プログラミング脳を作るか」だと思います。

 これは、手続き型プログラミングからオブジェクト指向プログラミング(OOP)にシフトする際にいかに OOP 脳を作るかということが問題になったのと同様です。もとから OOP に取り組んだ人は得に意識しなかったかも知れません。しかし、手続き型に慣れ親しんでいた方が OOP に移行したときはそうとうに苦労したなんてことも少なくなかったようです(そして挫折した人も!)。

 私も今、関数型プログラミング脳作りに苦労しています(関数型は Scala が初めてなので)。試行錯誤の連続です。


 そんな中、ふと気づいたことがあります。


 これまで「var は使わず val で」とか「while は使わず再帰で」などと文法的なことにばかりに振り回されていました。


 しかし、原点に帰ってみると、とにもかくにも「関数を意識する」に尽きると気づいたのです。


 当然ですよね。関数型プログラミングなんですから。

 つまり、今まではオブジェクト指向といっても、局所的には手続きなわけだったのです。あれやってこれやってと、処理を並べていくわけです。イメージとしては上から下に行く感じです。

 これに対して関数を意識すると「何を入力して何を取り出そうか」という発想を従来(手続き型、OOP)に比べてより強くすることになります。イメージとしては外から内、内から外という感じですかね。ループにしても、「これは何を入力して何を取り出そうとしてるのか」と意識するとうまく再帰関数化できるような気がします。




 ユニットテストなどに慣れ親しんでると、このような発想は当たり前なのでしょうが、関数型プログラミングの場合その粒度をさらに細かくする感じだと今のところ自己解決しております。