module MHask.Functor where
import Prelude hiding (Functor, fmap)
import MHask.Util
import Control.Monad.Trans.State
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Writer
class Functor t where
fmap :: (Monad m, Monad n, Monad (t m), Monad (t n))
=> (m ~> n) -> (t m ~> t n)
instance Functor (StateT s) where
fmap f m = StateT $ \s -> f (runStateT m s)
instance Functor (ReaderT r) where
fmap f m = ReaderT $ \r -> f (runReaderT m r)
instance Functor (WriterT w) where
fmap f m = WriterT $ f (runWriterT m)