Safe Haskell | Safe-Inferred |
---|
MultiLift class
class MultiLift mIn mOut whereSource
MultiLift
provides an mlift
method that invokes the lift
method of MonadTrans
multiple times, based on the requested
argument and result type. You will usually have to specify the
type of the argument explicitly.
Note that mlift
only works with up to 9 levels of nested monad
transformer.
MultiLift m m | |
(MonadTrans t9, Monad (t9 (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))))), MonadTrans t8, Monad (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))), MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t9 (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))))) | |
(MonadTrans t8, Monad (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))), MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))) | |
(MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))) | |
(MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t6 (t5 (t4 (t3 (t2 (t1 m)))))) | |
(MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t5 (t4 (t3 (t2 (t1 m))))) | |
(MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t4 (t3 (t2 (t1 m)))) | |
(MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t3 (t2 (t1 m))) | |
(MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t2 (t1 m)) | |
(MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t1 m) |
Example
module Main where import Control.Monad.MultiLift import Control.Monad.MultiWrap import Control.Monad.Reader import Control.Monad.Trans import Control.Monad.Wrap newtype Type1 = Type1 { unType1 :: String } type Reader1 = ReaderT Type1 IO newtype Type2 = Type2 { unType2 :: String } type Reader2 = ReaderT Type2 Reader1 r2 :: Reader2 () r2 = do -- Note that you have to specify the inner type s1 <- mlift (asks unType1 :: Reader1 String) liftIO $ putStrLn $ "s1: " ++ s1 ++ "\n" s2 <- asks unType2 liftIO $ putStrLn $ "s2: " ++ s2 ++ "\n" r1 :: Reader1 () r1 = do runReaderT r2 $ Type2 "this is the Reader2 contents" main :: IO () main = do runReaderT r1 $ Type1 "this is the Reader1 contents"