2008/09/25
State モナドがわからない
なんというか、途中でついていけなくなる。以下のような State モナドっぽいものがあるとする。
type State = Integer --適当
newtype StateM a = SM (State -> (a, State))
instance Monad StateM where
SM calc1 >>= f = SM (\s0 -> let (r, s1) = calc1 s0
SM calc2 = f r in calc2 s1
return v = SM (\s -> (v, s))
これの2行目までは頭がついていくんだけど、StateM を用いた計算の定義になると、ついていかなくなる。と思って上のソースを書いていたら、なんとなく分かってきた気がする。
- 1つ目の State を用いた関数 calc1 を、状態 s0 を以って評価する。
- その計算結果(r)から、次の StateM を生成(?)する (f r)。
- 生成した次の StateM の値となっている、calc1 の次に State を用いた計算を行なう関数 calc2 を、calc1 の評価後の状態 s1 を以って評価する。
という内容の関数を、(>>=) で構築しているのだね。
スポンサーサイト