手探りモナド1 - 目的

モナドは何のためにあるのか?というのが多分モナドの世界への最初の一歩だと思うけど、この一歩が険しい。ここを読むと、次のように書いてある。

モナドを、計算を合成して、より複雑な計算にする戦略と考えるといいでしょう。

計算を合成すると書いてあるけれど、ちょっとよくわからない。でも合成と言えば、関数合成なら知っている。 f . g というやつだ。

(f . g) x = f $ g x

これだと単に関数fとgを合成するだけだ。
でも、もし合成( . )の代わりに好きな細工を入れることができれば、いろんなことができる。例えば、

  • g xの結果がNothingだったらfを適用しない : Maybeモナド
  • fとgの間で状態っぽいものを共有する : Stateモナド

などなど。
モナドインスタンス(MaybeとかStateとか)によって仕込んでいる細工が違うので、できることは違ってくる。モナドっていう仕組みはそれぞれのインスタンスが細工を仕込むための枠組みだけを提供してくれるので、細工の方はインスタンスで好きにやんなさいということだ。
ところで細工の仕込み方だが、( . )をいじる訳にはいかないので、別に>>=というものを用意している。>>=を使うということは、仕込みの入った合成を使うことを意味する。ちょっと面倒なのは、f . gみたいに使っていたfとかgをそのまま使えるわけではなくて、モナドバージョンに置き換えなければいけない。fやgを置き換えるのは面倒だけど、でもモナドを使って便利になるメリットの方が上なら、モナドバージョンを用意するのも無駄じゃない。

まぁ、細かい話は置いといて、関数合成に仕込みを入れて、関数合成に紛れて影で何かやってしまうこと、これがモナドの目的だ。私はそう理解している。関数合成の代わりだから、Haskellの世界にモナドがあふれていても不思議はないよね。