Is Applicative IO implemented based on functions from Monad IO?

Viewed 1524

In "Learn You a Haskell for Great Good!" author claims that Applicative IO instance is implemented like this:

instance Applicative IO where
    pure = return
    a <*> b = do
        f <- a
        x <- b
        return (f x)

I might be wrong, but it seems that both return, and do-specific constructs (some sugared binds (>>=) ) comes from Monad IO. Assuming that's correct, my actual question is:

Why Applicative IO implementation depends on Monad IO functions/combinators?

Isn't Applicative less powerfull concept than Monad?


Edit (some clarifications):

This implementation is against my intuition, because according to Typeclassopedia article it's required for a given type to be Applicative before it can be made Monad (or it should be in theory).

5 Answers
Related