Hay un uso que aquí se propone (presumiblemente el origen de IdentityT: http://www.haskell.org/pipermail/libraries/2007-June/007563.html
El uso principal parece ser la de permitir la flexibilidad a nivel de código fuente, por ejemplo, alguien puede editar el código fuente a xmonad y sustituir su propio UserT sin editar demasiado código.
Traté de ver cómo eso podría funcionar para una biblioteca, puede usarlo para proporcionar un marcador de posición para insertar una mónada en el medio de una pila, no estoy seguro de una gran carcasa para eso sin embargo. Aquí está mi ejemplo ideado:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Main where
import Control.Monad.State
import Control.Monad.List
import Control.Monad.Reader
type X m a = StateT Int (m IO) a
something :: (Monad (m IO), MonadIO (m IO)) => (m IO) Int -> X m Int
something a = do
x <- lift a
put (x + 1)
liftIO $ print x
return x
listSomething = something $ ListT (mapM return [1,2,3,4])
plainSomething = return 5 :: IdentityT IO Int
main = do
x <- runListT (execStateT listSomething 3)
print x
y <- runIdentityT (execStateT plainSomething 3)
print y
runIdentity $ mapM (return . (+1)) [1..100]