[Haskell-beginners] Control.Monad.State: State CTOR unneeded to create a State?

Brandon S. Allbery KF8NH allbery at ece.cmu.edu
Sat Nov 1 12:02:41 EDT 2008

On 2008 Nov 1, at 12:23, Larry Evans wrote:
> That still leaves me confused about:
> put (n+1)
> AFAICT, with the preceding |n <- get|, this means:
> put (get+1)

The <- syntax (actually (>>=)) "unwraps" a monadic value (on condition  
that it is "rewrapped" later), so instead of |State Int Int| it's just  

> I'm trying to understand how to use MonadState. I would have
> expected tick would have been defined:
> tick = State (\n -> (n+1,n+1))

I think you meant \n -> (n,n+1)

> instead of the more obscure:
> tick = do n <- get
>           put (n+1)
>           return n

The above translates to

     get >>= \n -> put (n+1) >> return n

Expand (>>=):

     State (\s -> let (a,s') = runState get s
                   in runState (put (a+1)) s')

Expand |get| and |put|:

     State (\s -> let (a,s') = runState (State (\s'' -> (s'',s'')))
                   in runState (State (\_ -> ((),a+1))) s')

|runState| and |State| cancel:

     State (\s -> let (a,s') = (\s'' -> (s'',s''))
                   in (\_ -> (s',a+1)))

Now expand the inner lambdas:

     State (\s -> let (a,s') = (s,s)
                   in (s',a+1))

And collapse the let:

     State (\s -> (s,s+1))

(I think I did that right; at least I got the right result...)

The point of using the "more obscure" definition is that it uses the  
machinery already defined for |State| --- and (given that I'm not  
absolutely certain I expanded the above right!) using the machinery is  
easier to keep track of than expanding directly, while demonstrating  
the operation of |State| instead of just presenting a result without  
explanation of how it follows from the definition of |State|.

brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery at kf8nh.com
system administrator [openafs,heimdal,too many hats] allbery at ece.cmu.edu
electrical and computer engineering, carnegie mellon university    KF8NH

More information about the Beginners mailing list