[Haskell-cafe] Category theory monad <----> Haskell monad

Michael Vanier mvanier at cs.caltech.edu
Fri Aug 19 01:47:42 EDT 2005


The explanation given below might be a bit heavy for someone who didn't know much
about category theory.  For those individuals I'd recommend Phil Wadler's
papers:

http://homepages.inf.ed.ac.uk/wadler/topics/monads.html

I especially recommend "Monads for Functional Programming", "The Essence of
Functional Programming" and "Comprehending Monads".

Basically, though, the Haskell implementation _is_ the category theoretic
definition of monad, with bind/return used instead of (f)map/join/return as
described below.

Mike

> Date: Thu, 18 Aug 2005 20:39:37 -0400
> From: Cale Gibbard <cgibbard at gmail.com>
> Cc: haskell-cafe at haskell.org
> 
> On 14/08/05, Carl Marks <id2359 at yahoo.com> wrote:
> > Is there any text/article which makes precise/rigorous/explicit the connection
> > between the category theoretic definition of monad with the haskell
> > implementation?
> 
> Well, a monad over a category C is an endofunctor T on C, together
> with a pair of natural transformations eta: 1 -> T, and mu: T^2 -> T
> such that
> 1) mu . (mu . T) = mu . (T . mu)
> 2) mu . (T . eta) = mu . (eta . T) = id_C
> 
> In Haskell, a monad is an endofunctor on the category of all Haskell
> types and Haskell functions between them. Application of the
> endofunctor to an object is given by applying a type constructor (the
> one which is made an instance of the Monad class). Application of the
> endofunctor to a function is carried out by fmap or liftM. The natural
> transformation eta is called return, and mu is called join (found in
> the Monad library).
> 
> Haskell uses a somewhat different (but equivalent) basis for a monad,
> in that it is not map, return, and join which need defining to make a
> type an instance of the Monad class, but return and (>>=), called
> "bind" or "extend".
> 
> One can define bind in terms of fmap, and join as
> x >>= f = join (fmap f x)
> 
> and one can get back join and fmap from return and bind:
> join x = x >>= id
> fmap f x = x >>= (return . f)
> 
> hope this helps,
> - Cale
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
> 


More information about the Haskell-Cafe mailing list