
I am trying to understand State monad example15 at: http://www.haskell.org/all_about_monads/html/statemonad.html Example 15 uses getAny that I don't understand at all how it works: getAny :: (Random a) => State StdGen a getAny = do g <- get (x,g') <- return $ random g put g' return x Questions: 1) random has type: random :: (Random a, RandomGen g) => g -> (a, g) and for State monad: return a = State (\s -> (a, s)) then: return (random g) = State (\s -> ((a,g), s)) Is it correct? 2) What x and g' will match to in: do ... (x,g') <- return $ random g which, as I understand equals to: do ... (x,g') <- State (\s -> ((a,g), s)) What x and g' will match to in the last expression? 3) In general, in do expression (pseudo): do { x <- State (\s -> (a, s)); ...} What x will refer to? Will x stand for a whole lambda function: \s -> (a, s) ? 4) How 'g <- get' works in this function (getAny) ? 5) Why we need 'put g'? Thanks!