モナド変換子
doの中では同じ種類のモナドしか使うことが出来ない
が、モナド変換子を使うことで複数のモナドを扱うことができる
モナド変換子の論文?
呼び方
ReaderT Int (State Int) Intは「Reader Stateモナド」
ReaderT Int (StateT Int (Writer [Int])) Intは「Reader State Writerモナド」
型表記
例えばReaderTを使って、Reader Stateモナドを作る場合は ReaderT r m aを使ってReaderT B (State A) Cとする
これはState A Cと、Reader B Cを組み合わせてを作っている
https://gyazo.com/70aa3b054f36191ab872a93dc7899a19
モナド変換子で作ったものはモナド
ReaderT Env (ErrorT String Identity) aのように、モナド変換子の入れ子を作ることができる
ReaderT r m a
↑上の例ではmにErrorTモナド変換子で作ったErrorモナドが入っている
ErrorT e m a
モナド変換子を使わなくてもモナドの入れ子はできる
というか全てのHaskellプログラムはIOモナドをrootとしたモナドになっている
main=doの中で、何かしらのモナドを読んでいれば、関数を展開してベタがきすれば
code:tree
IO
├── Maybe -- State -- Maybe --..
└── State -- Either -- ..
みたいな入れ子になっている
一つのdoの中で複数のモナドを扱うのがモナド変換子
IOはモナド変換子を定義することはできない ref 既にIdentityを使っていたなら、それをIOに変えればいい
モナド変換子用のライブラリ
デファクトスタンダード
例
参考
理論
PureScript
テストに使用