[Haskell-cafe] A catch-all MonadIO instance

Paterson, Ross R.Paterson at city.ac.uk
Fri Oct 28 16:24:21 CEST 2011


Bas van Dijk writes:
> Is it unsafe to add the following catch-all MonadIO instance to
> transformers' Control.Monad.IO.Class module?
>
> {-# LANGUAGE FlexibleInstances, FlexibleContexts, UndecidableInstances #-}
>
> instance (MonadTrans t, Monad (t m), MonadIO m) => MonadIO (t m) where
>     liftIO = lift . liftIO
>
> It could get rid of all the similarly looking instances:
>
> instance (MonadIO m) => MonadIO (ReaderT r m) where
>     liftIO = lift . liftIO
> instance (MonadIO m) => MonadIO (StateT s m) where
>     liftIO = lift . liftIO
> instance (Monoid w, MonadIO m) => MonadIO (WriterT w m) where
>     liftIO = lift . liftIO
> ...

It's done that way in transformers to keep the package portable.
As for doing it elsewhere, although this catch-all instance requires
UndecidableInstances, I don't think it introduces non-termination.



More information about the Haskell-Cafe mailing list