I understand the error below, but I'm not really sure what an instance of liftIO would look like for the Identity functor. I guess I'm not all to clear on what an identity functor is.

I'm a little fuzzy on what an identity monad is. I understand that id gives the identity of something back pretty well though. Can anyone help?

If anyone could help me fix the code below as well as explain the questions I have above it would be a great help.

import Control.Monad.Trans.State
import Control.Monad.IO.Class

type MyState = State Int

modAndPrintState :: Int -> MyState ()
modAndPrintState x = do
  get >>= \i -> do
    liftIO . print $ i
    if even x then put (x + i) else put (i * (x + 1) - x)

main = undefined


-- Prelude Control.Monad.Trans.State> :r
-- [1 of 1] Compiling Main             ( blah2.hs, interpreted )

-- blah2.hs:9:5:
--     No instance for (MonadIO Data.Functor.Identity.Identity)
--       arising from a use of `liftIO'
--     Possible fix:
--       add an instance declaration for
--       (MonadIO Data.Functor.Identity.Identity)
--     In the first argument of `(.)', namely `liftIO'
--     In the expression: liftIO . print
--     In a stmt of a 'do' block: liftIO . print $ i
-- Failed, modules loaded: none.


Thanks!