金曜日に状態系のモナドを説明しないといけないので、例題を書いて比較できるようにしておきます。
呪文として、以下のモジュールを読み込んでおきましょう。
import Data.Char import Control.Monad.Identity import Control.Monad.Reader import Control.Monad.Writer import Control.Monad.State
Identityモナド
入力が一つで、出力が一つのモナド。面白みはない。
i :: Identity Int i = do x <- return 2 y <- return 3 return $ x * y
でも、モナドは Haskell の中に住むマイクロ言語で、このマイクロ言語でマイクロプログラムを作成した後は、run で実行するものだというイメージは分かるかも。
> runIdentity i → 6
Readerモナド
入力が二つで、出力が一つのモナド。入力の一方が、read only の状態。この状態は、マイクロプログラムを実行する際に環境として与えられ、ask で取り出せる。
r :: Reader Char Int r = do x <- ask y <- return 3 return $ digitToInt x * y
環境 '2'を与えて走らせてみる。(マイクロプログラムにとって、環境とはグローバル変数だと考えてよい。)
> runReader r '2' → 6