Здесь предлагается использование (предположительно, происхождение IdentityT: http://www.haskell.org/pipermail/libraries/2007-June/007563.html
Основное использование, по-видимому, заключается в том, чтобы обеспечить гибкость на уровне исходного кода, например, кто-то может отредактировать исходный код в xmonad и заменить егособственный UserT без редактирования слишком большого количества кода.
Я попытался увидеть, как это может работать для библиотеки - вы можете использовать ее для предоставления заполнителя для вставки монады в середину стека, я не уверенхотя это хороший пример. Вот мой надуманный пример:
{-# 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]