[Haskell-cafe] The State Monad

John Goerzen jgoerzen at complete.org
Thu Oct 7 18:56:25 EDT 2004

This thing is giving me fits.  I need a global variable of sorts for an
implementation of Syslog.  (Yes, I really do.)

It seems the right way to do that is the state monad.  But I can't
figure out how to do two simple things:

 * Read what is in there without modifying it

 * Modify it appropriately

I looked at the examples in Control.State.Monad.  We see:

 tick :: State Int Int
 tick = do n <- get
           put (n+1)
           return n

Add one to the given number using the state monad: 

 plusOne :: Int -> Int
 plusOne n = execState tick n

Which looks nice enough, but completely useless.  tick seems to be a
very complex way to say ((+) 1) in this example.  Oddly enough, I get a
type error if I try this:

tick :: Int -> State Int Int
tick newval = do put newval
                 return newval

Or this:

tick :: State Int Int
tick = do n <- get
          return n

That is even more incomprehensible to me -- why would removing a line
before the return cause a type error?

More information about the Haskell-Cafe mailing list