generated at
モナド変換子
Monad型クラスを入れ子にできる
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
↑上の例ではmにIdentityモナドが入っている



モナド変換子を使わなくてもモナドの入れ子はできる
というか全てのHaskellプログラムはIOモナドをrootとしたモナドになっている
main=do の中で、何かしらのモナドを読んでいれば、関数を展開してベタがきすれば
tree
IO ├── Maybe -- State -- Maybe --.. └── State -- Either -- ..
みたいな入れ子になっている
一つのdoの中で複数のモナドを扱うのがモナド変換子
IOはモナド変換子を定義することはできない ref
既にIdentityを使っていたなら、それをIOに変えればいい



モナド変換子用のライブラリ
デファクトスタンダード





参考



理論
『Extensible Effects An Alternative to Monad Transformers』のIntroductionを読んだらモナド変換子に関する論文がめちゃくちゃ参照されて出てくる

PureScript
テストに使用