「関数プログラミング実践入門」を読みました

かなり気になっていた関数プログラミング実践入門という本を早速買って読んでみました。

「関数プログラミングの考え方」が分かる本

本書は「関数プログラミングで何か作れるようになる本」というよりは、「関数プログラミングの考え方がしっかり分かる本」という感じで、「普段はJavaやRubyといったオブジェクト指向言語を使っているけど、何か関数型言語が気になるんだよねー」というノリの人に向いている本だと僕は思いました。

普段関数型言語を使っていない人、というと大多数の人がそうだと思いますが、その大多数の人に向けて「関数プログラミングの考え方ってこんな感じよ」というのを伝えているのが本書になります。

内容は

  • 関数型言語Haskellを題材とした関数プログラミングが備える要素の解説
  • 関数プログラミングでの設計テクニック

が大きな2本柱になっていて、特に「普段はJavaやRubyといったオブジェクト指向言語を使っているけど、何か関数型言語が気になるんだよねー」という向きには、モナドといった関数プログラミングの要素の話よりは、「関数プログラミングでの設計テクニック」の話が気になるところではないかなと思います。

普段オブジェクト指向言語を使っている人からすると、クラスとか使わないでどうやって大きなプログラムを書くんだろう?って感じですよね。

  • 関数型の方が抽象度が高いからコードが短くなる
  • バグを少なくするためには副作用を極力おさえるべきだ
  • オブジェクトが状態を持つからつらいんだ

などなど、関数プログラミングの利点はよく巷で聞くところですが、「で、どう設計するのかね?」と思う人も少なくないと思います。

この対比としてとても分かりやすいなーと思ったのが「第1章 比較で見えてくる関数プログラミング 1.4 構造化データの取り扱い」にあるVisitorパターンによる実装との比較例です。

式 ::= 式 '+' 式 | '(' 式 ')^2' | 数値

という式を評価したり文字列化するプログラムを作る、という例なのですが、「クラスによるデータ構造の表現」と「型によるデータ構造の表現」との対比が上手く表現されているのではないかと思います。本屋で手に取られたらまずここだけ読んでみてもらって、「おっ」と思うようであれば買って読んでみるというのも良さそうです。

更に本書のミソは

  • ランレングス圧縮
  • 数独
  • 複数のエスケープ
  • ロジックパズル

といった現実の問題に対して、関数プログラミングではどういった設計アプローチが取れるのか? ということを論じている「第6章 オススメの開発/設計テクニック」にあると思うのですが、ここで論じられている話を理解するためには、

  • 第2章 型と値
  • 第3章 関数
  • 第4章 評価戦略
  • 第5章 モナド

といった各論がしっかり理解できていないと面白くないのに加えて、このあたりの話を読みこなすには題材として扱われているHaskell自体に少し慣れ親しんでいないと難しいのでは、と感じました。

そういう訳で、Haskellを一度も触ったことがない!という人は、こちらのQiita記事を読んで(更に練習問題を解いて)から改めて本書を読むと、理解が深まるのではないかと思います。

逆に、型を制すれば、次章から学んでいく処理の実装や、第6章で学ぶ設計についてもまた制したと言って過言ではありません。実装とは「正しい文法」で「正しく型を合わせる」ことで、設計とは「求める性質を型で定義すること」だからです。(「第2章 型と値」2.7 まとめ」より引用)

型付けするということは、直面している問題がどのような性質のものであるかを決めるということでもあります。そのためには、当たり前ですが、問題の性質を正しく理解していなければできません。(「第6章 オススメの開発/設計テクニック 6.6 まとめ」より引用)

普段のオブジェクト指向設計から一歩離れて、関数プログラミングにおける型設計の世界に飛び込むのに、とても良いガイドになってくれるのではないかと思いました。