[Haskell-cafe] Is there an escape from MonadState+MonadIO+MonadError monad stack?

Tillmann Rendel rendel at informatik.uni-marburg.de
Sun Apr 7 00:34:00 CEST 2013


Hi,

Ömer Sinan Ağacan wrote:
> One thing I'm not happy about my Haskell programs is, almost all of my
> programs have a monad transformer stack consisting MonadError, MonadIO
> and MonadState.

You can try to write most of your program in pure functions that are 
called from a few "main" functions in the monad. Or, if you need some 
but not all monadic actions in each function, you can use the following 
pattern:

   -- This helper function cannot cause monadic effects other than
   -- throwing errors. But it can be used in arbitrary monads that
   -- support throwing errors.
   helper :: MonadError MyError m => ... -> m ...
   helper = do ...

   -- Same but with only allowing IO, but other monadic actions
   other :: MonadIO m => ... -> m ...
   other = do ...

   -- we can use both functions in the same monad
   main = runMyStack $ do
     helper
     other

This way, you have some control over what effects are allowed where.

   Tillmann



More information about the Haskell-Cafe mailing list