fc2ブログ

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. 1つ目の State を用いた関数 calc1 を、状態 s0 を以って評価する。
  2. その計算結果(r)から、次の StateM を生成(?)する (f r)。
  3. 生成した次の StateM の値となっている、calc1 の次に State を用いた計算を行なう関数 calc2 を、calc1 の評価後の状態 s1 を以って評価する。

という内容の関数を、(>>=) で構築しているのだね。

スポンサーサイト



comment

post