Magnolia Tech

いつもコードのことばかり考えている人のために。

『なっとく!関数型プログラミング』は読者の理解度の進捗を先読みして作り込まれた”プログラミング入門”の良書

良い、買おう、読もう、(コードを)書こう、以上!

『なっとく!関数型プログラミング』は、2022年に出版された『Grokking Functional Programming』の邦訳版で、主にScalaを題材として関数型プログラミングを学んでいくための入門書("Grokking"は、完全に理解する、という意味)。あくまで関数型プログラミングの考え方、コードの書き方、良い設計の指針の解説が主眼に置かれているので、Scalaの言語機能の入門書ではない。Scalaの言語仕様を網羅的に解説するような内容ではない(それでもScala3ベースの文法はきちんと取り込まれている)。


まず、今まで読んだ関数型プログラミングの入門書として一番分かりやすい……というより、おそらく各種プログラミングの入門書(言語機能だったり、設計方法論だったり)としても過去に読んだ中でも群を抜いて分かりやすかった。とにかく解説の順序が考え抜かれていて、「きっと読者は、今このくらいの理解度だから、次はこの概念を教えた方が効果的、こっちは基礎的な機能だけど、今は解説しない、後にする」というふうに、解説されるテーマの交通整理がしっかりされているから、「さっき出てきたアレはどこ行った?」みたいな混乱無く読み進められる。

例えば従来の解説書でよくあるような「関数型プログラミングの基本は再帰です」とばかりに最初に再帰の解説が来たりしないところが特に象徴的だった。再帰が出てくるのは中盤を過ぎて、後半に入るくらいのタイミングで出てくる。それは再帰自体の学習の難易度から言って、他の概念を学んだ後に出てきた方が、その必要性が理解し易いと判断されているからだろうけど、関数型プログラミングの解説書で、再帰がこんなに後ろに出てくるんだ、と驚いた。

リスト操作の中でも分かり易いdropなんかもかなり後の方に出てくる一方で、あくまで関数型プログラミングの概念を学ぶための入門書なので、Scalaの入門書では出てこないようなcats-effectや、fs2といったサードパーティライブラリが中盤くらいに当たり前のように出てくる。


特に序盤のPart1 関数型ツールキットは本当によく考え抜かれていて(全体的にそうだけど)、Javaで書かれた命令型のコードから、Scalaで書かれた関数型のコードとの比較に始まり、その後の多くのページを割いて関数型のコードが守るべき純粋関数の3つのルールを守るためのコードはどうやって書けば良いのか?ということを徹底的に、詳細に、ステップを踏んで解説が進む。

ここで言う純粋関数の3つのルールは以下の通り。

  • 1つの値だけを返す
  • 引数に基づいて戻り値を計算する
  • 既存の値を変更しない

そして、一貫して「関数のシグニチャ」の大切さを説いていく。関数型プログラミングでは、関数のシグニチャから予想できない振る舞いをしてはいけない。

そうやって状態管理の排除や、関数を引数に取る関数、戻り値に関数を返す等を学んでいく。


続くPart2でようやくお馴染みのflatMapOptionなどが出てくるが、特に中盤のモデル化の重要性、直積型、直和型、ADT(代数的データ型)からのパターンマッチの解説の流れが特にどんどん知識が繋がっていく感覚が体験できて良かった。

個人的には第8章の「値としてのIO」まで学んだら、残りのPart2は一回飛ばしてPart3に行ってもいいかもしれないと思った(でも、第9章に再帰が来るから、そこは寄り道してもいいけど)。たいていの人にとって、ストリーム処理や、並列処理を学ぶより、どうやって現実のビジネスアプリケーションにおけるコードに、関数型プログラミングの考え方を導入するか?というテーマの方が身近な気がするので。

そして、Part3は改めてPart1, 2で解説された機能を踏まえて、関数型プログラミングではどのような設計の流れになるのか、テストはどうすれば良いのかといったテーマでの解説が続く。はっきり言ってめちゃめちゃ密度が凄いので、じっくり読んで、コードを実行しながら理解するように心がけていかないと、ささっと重要なことが通り過ぎていく。というか、テスト周りはテーマ的にも密度が濃すぎるので、これまたじっくり腰を据えて取り組んだ方が良い内容でした。最近自分が関心を持っているプロパティベースドテスティングもちゃんと出てきました。


さまざまなテーマをもとに関数型プログラミングを解説しているけど、一貫してビジネスドメインへの関心と、プログラムとして動かすために必要なさまざまな制御のための機能(エラー処理とか)をどうやって分離するのか、ということを実践的に説いている内容なので、特にビジネスアプリケーションの設計に携わっている人はぜひ読んだ方がいいでしょう。明日から突然関数型プログラミング言語を使ったプロジェクトに入る訳でなくとも、この考え方は絶対に有益なので。


あと、表紙のキャラクターがとにかく良い!(本文中には全然出てこないけど……代わりに謎のおじさん達が出てくる)

500ページ近くあるし、コード部分のフォントサイズが小さかったりと、詰め込み感が半端ないけど、夏休みみたいにまとまった時間が取れる時じゃないと読みづらい本だと思うので、今すぐ本屋へ買いに行って、夏休みの準備にしよう!