I’m reading the Monads chapter in Real World Haskell (chapter 14).
A function is defined as follows:
type RandomState a = State StdGen a
getRandom :: Random a => RandomState a
getRandom =
get >>= \gen ->
let (val, gen')= random gen in
put gen' >>
return val
I don’t really understand the purpose of the get and put functions here.
I rewrote the function as following which seems to do the same thing and is more concise:
getRandom2 :: Random a => RandomState a
getRandom2= State $ \ s -> random s
So my question is: What is the purpose of get and put in general?
It’s a bit of a coincidence that
randomhappens to have exactly the same type signature/usage pattern as the inner function of theStatemonad (and indeed in this case you could be even more concise, if perhaps more confusing, withgetRandom2 = State random).However, more generally that won’t apply, and then
getandputare convenient plumbing pieces whose meaning is perhaps clearer than writing the inner function directly. They also help to abstract from the precise representation used byState– they are actually class members of the more general classMonadState, so you can write more polymorphic code by using them.