<div dir="ltr"><div><div>Hi cafe, I whipped up extensible-transformers (<br><a href="https://github.com/RobotGymnast/extensible-transformers">https://github.com/RobotGymnast/extensible-transformers</a>) this afternoon. The idea is to make  Monad transformer code more like extensible-effects code (<a href="http://hackage.haskell.org/package/extensible-effects">http://hackage.haskell.org/package/extensible-effects</a>). Here's a sample:<br>
</div><br><font size="1"><span style="font-family:courier new,monospace">{-# LANGUAGE FlexibleContexts #-}<br>module Main(main) where<br><br>import Control.Monad.Trans.Flexible<br>import Control.Monad.Trans.List<br>import Control.Monad.Trans.State.Strict<br>
<br>-- A flexible transformer stack built from existing transformers using `liftT`.<br>bar :: (In (StateT Int) t, In ListT t) => t ()<br>bar = do<br>    n <- liftT get<br>    liftT $ ListT $ return $ replicate n ()<br>
<br>-- A flexible transformer stack built from existing transformers using `liftT`.<br>baz :: In (StateT Int) t => t ()<br>baz = do<br>    liftT $ state $ \i -> ((), i + (1 :: Int))<br><br>-- A flexible transformer monad stack composed of two other flexible<br>
-- transformer monad stacks.<br>foo :: (In (StateT Int) t, In ListT t) => t ()<br>foo = do<br>    bar<br>    baz<br><br>main :: IO ()<br>main = do<br>    evalStateT (runListT foo) (1 :: Int) >>= putStrLn . show<br>
    runListT (evalStateT foo (2 :: Int)) >>= putStrLn . show</span></font><span style="font-family:courier new,monospace"><br></span><br>Any feedback on this? Does such a package already exist?<br><br></div>Thanks,<br>
Ben<br></div>