[Haskell-cafe] Commutative monads vs Applicative functors

Conal Elliott conal at conal.net
Sat Jul 9 18:59:11 UTC 2016


Eight years later, I stumbled across this thread.

Here's a cute way to express commutativity of an applicative functor:

> forall f. flip (liftA2 f) == liftA2 (flip f)

Cuter yet,

> flip . liftA2 == liftA2 . flip

-- Conal

On Wed, May 14, 2008 at 9:59 AM, David Menendez <dave at zednenem.com> wrote:

> On Tue, May 13, 2008 at 9:06 PM, Ronald Guida <oddron at gmail.com> wrote:
> > I have a few questions about commutative monads and applicative functors.
> >
> >  >From what I have read about applicative functors, they are weaker than
> >  monads because with a monad, I can use the results of a computation to
> >  select between alternative future computations and their side effects,
> >  whereas with an applicative functor, I can only select between the
> >  results of computations, while the structure of those computations and
> >  their side effects are fixed in advance.
> >
> >  But then there are commutative monads.  I'm not exactly sure what a
> >  commutative monad is, but my understanding is that in a commutative
> >  monad the order of side effects does not matter.
> >
> >  This leads me to wonder, are commutative monads still stronger than
> >  applicative functors, or are they equivalent?
> >
> >  And by the way, what exactly is a commutative monad?
>
> A monad is commutative if the expression "a >>= \x -> b >>= \y -> f x
> y" is equivalent to "b >>= \y -> a >>= \x -> f x y". The identity,
> state reader, and maybe monads are commutative, for example.
>
> To put it another way, a monad is commutative if
>
>     liftM2 f a b = liftM2 (flip f) b a
>
> Since liftA2 generalizes liftM2, we can also say that an applicative
> functor is commutative if
>
>     liftA2 f a b = liftA2 (flip f) b a
>
> Or, put another way, if
>
>     a <*> b = flip ($) <$> b <*> a
>
> If w is a commutative monoid (that is, if mappend w1 w2 == mappend w2
> w1), then Const w is a commutative applicative functor.
>
> To summarize: some applicative functors are commutative, some
> applicative functors are monads, and the ones that are both are
> commutative monads.
>
> --
> Dave Menendez <dave at zednenem.com>
> <http://www.eyrie.org/~zednenem/>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160709/c5bb794e/attachment.html>


More information about the Haskell-Cafe mailing list