
2008/9/8 Daryoush Mehrtash
The MaybeT transformer is defined as:
newtype MaybeT m a = MaybeT {runMaybeT :: m (Maybe a)}
Question: What does "runMaybeT x" mean?
This is just shorthand for the following:
newtype MaybeT m a = MaybeT (m (Maybe a)) runMaybeT :: MaybeT m a -> m (Maybe a) runMaybeT (MaybeT x) = x
(with some minor differences to automated deriving of Show instances) At runtime, runMaybeT and MaybeT are just really fast identity functions (they should get optimized out of existence, even!) So, if you have "x :: MaybeT m a" at runtime, you really just have "runMaybeT x :: m (Maybe a)"
instance Functor m => Functor (MaybeT m) where fmap f x = MaybeT $ fmap (fmap f) $ runMaybeT x
This code is a bit confusing at first because each fmap is at a different type. The first (in the function declaration) is
fmap :: Functor m => (a -> b) -> MaybeT m a -> MaybeT m b
The second (*fmap* (fmap f)) is
fmap :: Functor m => (Maybe a -> Maybe b) -> m (Maybe a) -> m (Maybe b)
The third (fmap (*fmap* f)) is
fmap :: (a -> b) -> Maybe a -> Maybe b
When you work with functors a lot you start to be able to read this stuff more easily. -- ryan