Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The reason for MonadState get and put?

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?

like image 728
CiscoIPPhone Avatar asked Apr 04 '10 15:04

CiscoIPPhone


1 Answers

It's a bit of a coincidence that random happens to have exactly the same type signature/usage pattern as the inner function of the State monad (and indeed in this case you could be even more concise, if perhaps more confusing, with getRandom2 = State random).

However, more generally that won't apply, and then get and put are convenient plumbing pieces whose meaning is perhaps clearer than writing the inner function directly. They also help to abstract from the precise representation used by State - they are actually class members of the more general class MonadState, so you can write more polymorphic code by using them.

like image 62
GS - Apologise to Monica Avatar answered Nov 15 '22 18:11

GS - Apologise to Monica