[Haskell-cafe] MonadTrans lift implementation
Jonathan Cast
jonathanccast at fastmail.fm
Mon Jan 19 16:13:37 EST 2009
On Mon, 2009-01-19 at 13:03 -0800, Daryoush Mehrtash wrote:
> Is there a reason why the lift function in ReaderT's MonadTrans instance is implemented as:
>
> instance MonadTrans (ReaderT r) where
>
> lift m = ReaderT $ \_ -> m
>
>
>
> Instead of just using the monad's return function? Could "lift m" be implemented as "return m"?
No:
Prelude> :m + Control.Monad.Reader
Prelude Control.Monad.Reader> :t \ m -> ReaderT $ \ _ -> m
\ m -> ReaderT $ \ _ -> m :: m a -> ReaderT r m a
Prelude Control.Monad.Reader> :t \ m -> ReaderT $ \ _ -> return m
\ m -> ReaderT $ \ _ -> return m :: (Monad m) => a -> ReaderT r m a
Your first clue that something's wrong should be that the types don't
work out.
(On the other hand, your hunch that lift = return is correct --- so you
get a cookie for that; it's just that return here is neither the return
of the monad for m nor the return of the monad for ReaderT m. It is,
instead, the return of the *applicative functor* --- on the category of
monads and monad homomorphisms --- associated to the monad transformer
ReaderT.)
(By the way, you *do* have the equations
lift (return x) = return x
and
lift (a >>= f) = lift a >>= lift . f
)
jcc
More information about the Haskell-Cafe
mailing list