ゼロから関数型プログラミングの概要をつかむのに役立った3冊

「関数型プログラミング」という言葉が、良く聞かれるようになってきました。
「安全なプログラムが書ける」とか、「簡潔な表現ができる」とか、噂レベルでは聞きつつ、学術的な香りが強いのかなと思っていたので、手を出していませんでした。

なぜ関数型プログラミングを勉強しようと思ったのか?

では、なぜ関数型プログラミングを勉強しようと思ったかというと、「実際に活用できるのではないか」というイメージが湧いたというか、必要に迫られたからです。
最近ブログにもアップしていますが、分散環境での高速な分析について検証をしています。目的は、プッシュ通知の解析サービスGrowth Pushの解析基盤の強化です。
分散SQLクエリエンジンPrestoをMac OS Xにインストール
高速な分散処理エンジンApache Sparkの操作を対話シェルで試してみる!
データが大規模化してくると、性能要件を達成するために、処理の並列化が必要になります。
並列処理というのは、実際にやってみると難しいです。その難しさの原因は、並列して実行される処理が、お互いに影響を及ぼし合ってしまうことです。
関数型プログラミングは、そういうお互いに影響してしまうような難しい部分を、極端に少なくしてくれます。

ラムダ式とStream APIを学ぶ

そういうわけで、関数型言語や、関数型プログラミングが直接的に使えずとも、考え方は解析基盤の強化に使えそうだ、ということで勉強することにしました。
僕は、最近はJavaを良く使っているのですが、最近リリースされたJava 8から関数型プログラミングの考えを取り込みはじめたので、ここから入門しようと思いました。
512UYJKsRAL._SL500_AA300_
Java8ではじめる「ラムダ式」
この本は、Java 8で使えるようになったラムダ式の表現を、今までのJavaのインタフェースとの比較で分かりやすく説明しています。これを読んで、Javaでのラムダ式の表現を学ぶことができました。
Java8で追加されたラムダ式を使ってみる!Mac OS X、Eclipse、Mavenへの導入から。
後半では、JavaのStream APIについて説明されています。Stream APIを使うと、今までのfor文を分かりやすく書き換えることができます。

関数型プログラミングの考えを学ぶ

前の本は、Javaの新しい機能の説明、という感じで、関数型プログラミングの説明には踏み込んでいません。
そこで、もう少し踏み込んで関数型プログラミングを学びたくなったので、この本を読みました。
81rtHTBa6iL
Javaによる関数型プログラミング ―Java 8ラムダ式とStream
この本では、今までの命令型プログラミングと、関数型プログラミングを比較しながら、表現の簡潔さなどについても触れています。
またStream APIについても、parallelメソッドひとつで即座に処理を並列化できたり、遅延計算によって無駄なリソース消費をしないことなども挙げていて、関数型プログラミングのメリットを理解することができます。

本格的な関数型言語への入門

ここまでJavaで学んできましたが、そうは言ってもJavaは「関数型プログラミングを取り入れた言語」にすぎません。
最後に、Javaから離れて、本格的に関数型言語に入門します。
51C0LpV9lGL
関数プログラミング実践入門 ──簡潔で、正しいコードを書くために
この本は、「関数型プログラミングとは」という話から、実際にHaskellを使って、関数型のプログラミングを体験できるところまで説明されています。
この本の半分くらいは、Haskellの使い方の説明ですが、Haskellを学ぶことが直接的に関数型プログラミングを学ぶことになります。
Mac OS XにHaskellの開発環境を構築してHello World
関数型プログラミングの話で時々名前を聞く、モナドという概念についても説明されています。

次はどうするか?

ここまで読んで、Javaに取り入れられた関数型プログラミングの具体的な理解から、Haskellによるかなり抽象的な考え方の理解まですることができました。
次は、Haskellをもう少し使ってみて関数型の概念を体で理解できるようにするか、もう少しゆるくScalaを使って何かサービスを作るかをしてみようと思っています。

タイトルとURLをコピーしました