[Haskell-cafe] unsafeInterleaveIO respecting order of actions

Henning Thielemann lemming at henning-thielemann.de
Sun Jan 4 14:50:53 EST 2009

On Sat, 3 Jan 2009, Henning Thielemann wrote:

> I think I now have general Applicative functionality ...

I hope the following is a proper Monad implementation. In contrast to 
Applicative a Writer for sequencing actions does no longer work, instead I 
need a State monad.

newtype LazyIO a = LazyIO {runLazyIO :: StateT RunAll IO a}

data RunAll = RunAll
    deriving Show

instance Monad LazyIO where
    return x = LazyIO $ return x
    x >>= f = LazyIO $
       mapStateT unsafeInterleaveIO . runLazyIO . f =<<
       mapStateT unsafeInterleaveIO (runLazyIO x)

instance MonadIO LazyIO where
    liftIO m = LazyIO $ StateT $ \RunAll -> fmap (\x->(x,RunAll)) m

evalLazyIO :: LazyIO a -> IO a
evalLazyIO =
    flip evalStateT RunAll . runLazyIO

I'll write some tests and upload it to Hackage.

Thank you for being a patient audience. ;-)

More information about the Haskell-Cafe mailing list