4

State Monad の get 関数による 1 つの質問:

私が走れば

runState 取得 1

結果が出ました

(1,1)

get 関数は結果の値を状態に設定し、この場合は状態が 1 であるため、これは問題ありません。したがって、(1,1) が結果です。Ok。

しかし、私が実行すると

runState (do{(a,b) <- get; return a}) (偽、0)

結果が出ました

(偽,(偽,0))

そして、これは私には理解できません。

get 関数は結果値を状態に設定し、状態を変更しませんでした。だから私が期待するのはこのようなものです

((偽,0),(偽,0))

これも同じ

runState (do{(a,b) <- get; return b}) (False, 0)

結果は

(0,(偽,0))

上記のように、これもわかりません。

ですから、この奇妙な結果について説明していただければ幸いです。;)

前もって感謝します

よろしくお願いします、

ジミー

4

3 に答える 3

9

これは、 の後に何かを行うためです。getつまりreturn、コンポーネントの 1 つです。newtype-wrapping を無視して、

return x = \s -> (x,s)

それで

do { (a,b) <- get; return a }   ===   get >>= \(a,b) -> return a

に展開します

(\s -> (s,s)) >>= \(a,b) -> (\t -> (a,t))

そしてその定義により(>>=)

\s1 -> let (r,s2) = (\s -> (s,s)) s1
       in (\(a,b) -> (\t -> (a,t))) r s2

の初期状態でそれを実行すると、(False,0)展開されます

let (r,s2) = (\s -> (s,s)) (False,0)
~> let (r,s2) = ((False,0),(False,0))
in (\(a,b) -> (\t -> (a,t))) r s2
~> in (\(a,b) -> (\t -> (a,t))) (False,0) (False,0)
~> in (\t -> (False,t)) (False,0)    -- match (a,b) with (False,0)
~> in (False, (False,0))

の他のケースreturn bも同様です。

于 2012-08-02T22:06:23.657 に答える