Search code examples
haskellapplicativefam-proposal

Is there an "ApplicativeIO" class?


Is there somewhere in Hackage a typeclass analogous to MonadIO but for Applicatives, that allows one to easily lift IO actions to "applicative composition stacks" based on IO?

If such a typeclass existed, would it be made obsolete by the implementation of the Applicative-Monad Proposal? Does the proposal involve a relaxation on the Monad constraint for MonadIO?


Solution

  • There was a related discussion on haskell-cafe a year ago. In the Reddit comments I gave an example of a natural transformation (g) from IO to another monad that is an applicative functor morphism (i.e., satisfies the laws that Gabriel Gonzalez mentioned) but is not a monad morphism (it does not satisfy the additional law relating to >>=). So, even in a world with AMP, ApplicativeIO m and MonadIO m are really different things, even when m is a Monad!

    In an ideal world you'd have a setup like this:

    class Functor f => FunctorIO f where
        liftIO :: IO a -> f a
        -- such that liftIO is a natural transformation (automatic, by parametricity)
    
    class (Applicative f, FunctorIO f) => ApplicativeIO f where
        --   ... and liftIO is an applicative functor morphism
    
    class (Monad f, ApplicativeIO f) => MonadIO f where
        --   ... and liftIO is a monad morphism
    

    and magical fairies would define ApplicativeIO and MonadIO instances exactly when the corresponding laws were satisfied.