Haskellのモナドいろいろ (まとめ)

分類

  • 上記の記事で述べた8つのモナドは、2種類に分類できる。
  • 失敗系:List, Maybe, Either
  • 状態系:IO, ST, State, Reader, Writer
  • モナドには他にも種類があるが、まずはこの2種類を押さえておく。

失敗系 (List, Maybe, Either)

  • 失敗系モナドは、本来期待されるデータ型以外に、値が無い(失敗)という値がありうる。
  • そのため、エラー処理に利用できる。
  • 失敗系モナドは、計算が失敗する可能性がある関数を連鎖させることができる。
  • どこかで失敗した場合、その後の計算は行われず、最終結果は失敗になる。
  • List を失敗系と呼ぶのは違和感があるが、空リスト [] を値にとりうるのでここに含める。
  • Maybe は値が無い (Nothing) という値をとりうる。
  • Either は値が無いときにエラー情報の値を持たせることができる。

状態系 (IO, ST, State, Reader, Writer)

  • 状態系は、純粋関数型言語である Haskell で状態を扱うために使われる。
  • IO は入出力を扱う。また IORef は変更可能な変数のようなものとして利用できる。
  • IO の外に値を持ち出すことはできない。(IOがつきまとう。)
  • ST は外に値を持ち出すことができる。STRef は変更可能なローカル変数のようなものとして利用できる。
  • State は値だけでなく状態も持ち出せる。
  • State は連鎖した関数の間で状態を共有してグローバル変数のようなものとして利用できる。
  • Reader は読み取り専用の値を共有できる。グローバル定数のようなものとして利用できる。
  • Writer は追記専用の値を共有できる。ログを取るために使われることが多い。

ポエム

  • モナドジェネリック型のコンテナのようなもの」というのは本質的な理解ではないが、実践的な理解の足掛かりにはなる。
  • 「クラスは構造体の拡張のようなもの」というのは本質的な理解ではないが、実践的な理解の足掛かりにはなったのと同じ。
  • モナドブリトーのようなもの」みたいなよく分からない比喩は役に立たない。
  • 「クラスはたい焼きの型のようなもの」みたいなよく分からない比喩は役に立たなかったのと同じ。
  • そもそもブリトーなんて料理食べたことないから比喩として成立しない。
  • モナドは自己関手の圏におけるモノイド」という説明は、ブリトーと五十歩百歩。
  • あれは圏論の教科書の一節であって、群論の基礎知識があると想定される読者への説明。
  • モノイドなにそれおいしいのな人には何の説明にもならない。