『関数プログラミング実践入門』読んだ

関数プログラミングを習得したくなったので購入。 本書では純粋関数型言語Haskellを題材にしている。

関数プログラミングの特徴を簡単に挙げるなら

  • 値に関数を適用していくことで計算を進めるプログラミングスタイル
  • 関数は、手続きではなく数学的な関数
    • 副作用を持たない
  • プログラムは関数
    • 大きなプログラムは小さなプログラムの組み合わせ
    • つまり関数合成

ってところ。

実践するには、関数が第一級の対象(動的に作れたり変数に格納できたり)の言語を使う必要があるけど、 JavaScriptC#でやれないことは無さそう。 さすがにHaskell関数型言語なだけある。 関数がカリー化されているから部分適用しやすい。 関数合成も数式みたいに書けて見た目も美しい。

あと、実際のアプリケーションでは画面やファイルへの入出力といった副作用が必須なはず。 Haskellで実装する場合でもそれは避けられない。 それなのにどうやって『言語として純粋』でいられるのか興味があった。

そのトリックが、文脈を持つ計算を扱う仕掛けであるモナド。 本書によれば、

  • モナドは『ある一定条件のもとで型aの値を作り出すためのレシピ』のようなものを組み上げている
  • レシピは外界の状況に関係なく、常に同じものが組み立てられる
  • そのレシピに一定条件を与えて実行するのは実行器の役割
  • 副作用を扱うのはIOモナド
  • IOモナドの実行器はHaskellのランタイム

とある。 なるほど、『言語として純粋』という意味が少し分かった気がする。

副作用を扱う箇所をIOモナドに限定し、 それ以外を純粋でキレイにしたHaskellの世界の裏側をもっと知りたくなった。 本書の範囲を逸脱するからと言わずに、IOモナドの詳しい説明がもっと欲しかった。 それにしてもモナドは難しい。 理解できたとはとても言えないので、本書を何度も読み返す必要があるな。