モナドでの
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` の位置にあるものが <-
により取り出される。のだと思いますが、そういうものと考えてしまって良いものでしょうか ?