# Difference between revisions of "Simple StateT use"

From HaskellWiki

m (Added type signatures) |
m |
||

Line 10: | Line 10: | ||

main = runStateT code [1..] >> return () |
main = runStateT code [1..] >> return () |
||

-- |
-- |
||

− | -- layer |
+ | -- layer an infinite list of uniques over the IO monad |

-- |
-- |
||

## Revision as of 21:53, 27 February 2007

A small example showing how to combine a State monad (in this case a unique supply), with the IO monad, via a monad transformer.

No need to resort to nasty mutable variables or globals!

```
import Control.Monad.State
main :: IO ()
main = runStateT code [1..] >> return ()
--
-- layer an infinite list of uniques over the IO monad
--
code :: StateT [Integer] IO ()
code = do
x <- pop
io $ print x
y <- pop
io $ print y
return ()
--
-- pop the next unique off the stack
--
pop :: StateT [Integer] IO Integer
pop = do
(x:xs) <- get
put xs
return x
io :: IO a -> StateT [Integer] IO a
io = liftIO
```