I wonder if Applicative is derived naturally through MonadTransformer's Monad

75 Views Asked by At

For the type constraint's point of view, Monad be derived from Applicative, which is the reverse of what I wrote in the title. However, it's not a mistake. While studying Monad, I have checked all the relationships below to see if they are satisfied. Specifically, I always checked if the Applicative (and Functor) be derived naturally from Monad.

// 0. Monad -> Monad
join mma = mma >>= id

ma >> mb = ma >>= const mb

// 1. Moand -> Applicative
mf <*> ma = do
            x <- mf
            y <- ma
            return (x y)

pure = return

// 2. Monad -> Functor

fmap f ma = ma >>= return . f

// 3. Applicative -> Applicative
fa *> fb = pure (const id) <*> fa <*> fb

// 4. Applicative -> Functor
f <$> fa = pure f <*> fa

// 5. Applicative -> Monoid (for Monoid a)
mempty = pure mempty
fa <> fa' = (<>) <$> fa <*> fa'

// 6. Foldable -> Foldable
foldr f z ta = (foldMap f ta) z  // f :: a -> (b -> b). We consider (b -> b) as Endo monoid
foldMap f ta = foldr (\x y -> f x <> y) mempty ta

// 7. Traversable -> Functor
fmap f ta = runIdentity $ traverse (Identity . f) ta

// 8. Traversable -> Foldable
foldMap f ta = getConstant $ traverse (Constant . f) ta

It's cool. I checked all of the Monads so that all of the instances (Monad, Functor, Applicative, Monoid, Foldable, Traversable) have the same context.

All of the instances makes harmony, following above 0 ~ 9 laws. Maybe, Either, List, Reader, Writer, State, Constant, Products of arbitrary number of types with duplicated types etc...

Now, I finally entered the Monad Transformers chapter in the book I'm reading now.

And I'm in trouble.

I can't check if Applicative instance of MaybeT aligns with Monad instance of MaybeT.

Actually, I faild for all of the MonadTransformers, except for IdentityT.


MaybeT mMf :: MaybeT m (a -> b)
MaybeT mMa :: MaybeT m a
mMf :: m (Maybe (a -> b))
mMa :: m (Maybe a)


MaybeT $ (<*>) <$> (MaybeT mMf) <*> mMa == do
                                           x <- mMf
                                           y <- mMa
                                           return (x y)  // is this true???

//given
MaybeT mMx :: MaybeT m x
mMx :: m (Maybe x)

f :: x -> MaybeT m y

MaybeT mMx >>= f =
  MaybeT $ do
    Mx <- mMx
    case Mx of
      Nothing -> return Nothing
      Just x -> runMaybeT (f x)


return = pure

pure = MaybeT . pure . pure

Can I get some help to get assure that Applicative of MaybeT is in a same context with Monad of MaybeT?

0

There are 0 best solutions below