モナドでの
State s モナドを例にとります。
上記の定義に対して以下のようなプログラムを実行します。
結果は以下の通りです。(hugs)
動作自体は理解できたのですが、`a <- pop` により値 (Int) が束縛される理由がわかりません。
Maybe モナドで考えて
また、`(a, s) <- pop` であった場合は
モナド値 State s
のだと思いますが、そういうものと考えてしまって良いものでしょうか ?
<- の挙動について質問させてください。State s モナドを例にとります。
newtype State s a = State { runState :: s -> (a,s) }
instance Monad (State s) where
return a = State $ \s -> (a, s)
(State h) >>= f = State $ \s ->
let
(a, newState) = h s
(State g) = f a
in
g newState
pop = State $ (\(a:s) -> (a,s))上記の定義に対して以下のようなプログラムを実行します。
steps :: State [Int] Int
steps = do
a <- pop
return a
f = runState steps [1..5]結果は以下の通りです。(hugs)
Main> :set +t Main> :l b.hs Main> f (1,[2,3,4,5]) :: (Int,[Int])
動作自体は理解できたのですが、`a <- pop` により値 (Int) が束縛される理由がわかりません。
Maybe モナドで考えて
a <- Just a の場合は Just が外れて a が取り出されている。と理解しやすいです。また、`(a, s) <- pop` であった場合は
Monad (State s) の定義と矛盾するような気がするので、違うのかと考えています。モナド値 State s
a の場合、`a` の位置にあるものが <- により取り出される。のだと思いますが、そういうものと考えてしまって良いものでしょうか ?