モナド変換子
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
を組み合わせてを作っている
モナド変換子で作ったものはモナド
ReaderT Env (ErrorT String Identity) a
のように、モナド変換子の入れ子を作ることができる
ReaderT r m a
↑上の例ではmにErrorTモナド変換子で作ったErrorモナドが入っている
ErrorT e m a
モナド変換子を使わなくてもモナドの入れ子はできる
というか全てのHaskellプログラムはIOモナドをrootとしたモナドになっている
main=do
の中で、何かしらのモナドを読んでいれば、関数を展開してベタがきすれば
treeIO
├── Maybe -- State -- Maybe --..
└── State -- Either -- ..
みたいな入れ子になっている
一つのdoの中で複数のモナドを扱うのがモナド変換子
IOはモナド変換子を定義することはできない
ref既にIdentityを使っていたなら、それをIOに変えればいい
モナド変換子用のライブラリ
デファクトスタンダード
例
参考
理論
PureScript
テストに使用