Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 885
danidiaz Avatar asked Sep 26 '14 16:09

danidiaz


1 Answers

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.

like image 161
Reid Barton Avatar answered Oct 19 '22 21:10

Reid Barton