ここで提案された使用法があります (おそらく 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]