import Control.Monad.State data Person = Person { id :: Int, name :: String } deriving Show type MyState = Int startState = 0 tick :: State MyState Int tick = do n <- get put (n+1) return n names = ["Adam","Barney","Charlie"] (persons, lastId) = (`runState` startState) $ do forM names $ \thisName -> do newId <- tick return $ Person newId thisName main = print persons