すごいHaskellのモナド変換子を理解したら読めばいいと思います、というか読むべき。超わかりやすかった。合体ロボ並に合成されて強そうな型に変換していく様は圧巻のゴーカイジャー(見てないからしらんけど)
スマイルプリキュアで例えると、「プリキュア・レインボーヒーリング」ですね(多分)。
最初に簡単な評価器からはじめる
eval0 :: Env -> Exp -> Value
という型から始めてモナドにする。
type Eval1 a = Identity a
次にエラーモナド変換子を重ねて
type Eval2 a = ErrorT String Identity a
環境であるReaderTを重ねる
type Eval3 a = ReaderT Env (ErrorT String Identity) a
続いて、状態を重ねる
type Eval4 a = ReaderT Env (ErrorT String (StateT Integer Identity)) a
ログ機能を導入して
type Eval5 q = ReaderT Env (ErrorT String (WriterT [String ] (StateT Integer Identity))) q
最後にお約束のIO
type Eval6 a = ReaderT Env (ErrorT String (WriterT [String ] (StateT Integer IO))) a
順番にテンポよく積み上がっていくので、読んでて悩むことなく最後の型まで到達できるので素晴らしい。英語も平易だし。
さらっと読んでみてよく分からなかったら、すごいHaskellに立ち戻ればいいでしょう。