{-# LANGUAGE FunctionalDependencies, UndecidableInstances #-} module Control.Monad.Base where import Control.Monad.Trans; import Control.Monad.Identity; class (Monad b, Monad m) => MonadBase b m | m -> b where liftBase :: b a -> m a; instance (MonadTrans xT, Monad (xT m), MonadBase b m) => MonadBase b (xT m) where liftBase = lift . liftBase; instance MonadBase IO IO where liftBase = id; instance MonadBase Maybe Maybe where liftBase = id; instance MonadBase (Either a) (Either a) where liftBase = id; instance MonadBase [] [] where liftBase = id; instance MonadBase ((->) r) ((->) r) where liftBase = id; instance MonadBase Identity Identity where liftBase = id;