モナド変換子
Monad transformer
Monad型クラスを入れ子にできる
doの中では同じ種類のモナドしか使うことが出来ない
が、モナド変換子を使うことで複数のモナドを扱うことができる
モナド変換子の論文?
Functional Programming with Overloading and Higher-Order Polymorphism pdf
lifting
モナドスタックとliftingの図的理解
モナドスタックのスタックの順番
Haskellでevalを作る
呼び方
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
↑上の例ではmにIdentityモナドが入っている
モナド変換子を使わなくてもモナドの入れ子はできる
というか全てのHaskellプログラムはIOモナドをrootとしたモナドになっている
main=doの中で、何かしらのモナドを読んでいれば、関数を展開してベタがきすれば
code:tree
IO
├── Maybe -- State -- Maybe --..
└── State -- Either -- ..
みたいな入れ子になっている
一つのdoの中で複数のモナドを扱うのがモナド変換子
IOはモナド変換子を定義することはできない ref
既にIdentityを使っていたなら、それをIOに変えればいい
モナド変換子用のライブラリ
mtl
デファクトスタンダード
Monatron
https://hackage.haskell.org/package/Monatron
例
StateT
ReaderT
WriterT
参考
Haskell モナド変換子 超入門 - Qiita
モナドトランスフォーマー・ステップ・バイ・ステップ(Monad Transformers Step By Step) - りんごがでている
モナド変換子(その1: 基本) - Qiita
Haskellでevalを作るに書いた
理論
『Extensible Effects An Alternative to Monad Transformers』のIntroductionを読んだらモナド変換子に関する論文がめちゃくちゃ参照されて出てくる
Monad transformers and modular interpreters
Representing monad
Andrzej Filinski
Representing layered monads
Andrzej Filinski
https://github.com/shiatsumat/wiwinwlh-jp/wiki/モナド変換子
https://blog.eiel.info/blog/2016/07/03/ltdd-27-io-maybe/
https://qiita.com/HirotoShioi/items/ac75b97aa52f9db9c472
https://qiita.com/HirotoShioi/items/6faaf8babb23bb2f3485
https://github.com/e-bigmoon/haskell-blog/issues/169
https://blog.asial.co.jp/1893
PureScript
テストに使用
https://qiita.com/ruicc/items/7512c990a1835bba444a