This question has some good answers: Monads as adjunctions
More to the point, Derek Elkins’ “Calculating Monads with Category Theory” article in TMR #13 should have the sort of constructions you’re looking for: http://www.haskell.org/wikiupload/8/85/TMR-Issue13.pdf
Finally, and perhaps this is really the closest to what you’re looking for, you can go straight to the source and look at Moggi’s seminal papers on the topic from 1988-91: http://www.disi.unige.it/person/MoggiE/publications.html
See in particular “Notions of computation and monads”.
My own I’m sure too condensed/imprecise take:
Begin with a category Hask
whose objects are Haskell types, and whose morphisms are functions. Functions are also objects in Hask
, as are products. So Hask
is Cartesian closed. Now introduce an arrow mapping every object in Hask
to MHask
which is a subset of the objects in Hask
. Unit!
Next introduce an arrow mapping every arrow on Hask
to an arrow on MHask
. This gives us map, and makes MHask
a covariant endofunctor. Now introduce an arrow mapping every object in MHask
which is generated from an object in MHask
(via unit) to the object in MHask
which generates it. Join! And from the that, MHask
is a monad (and a monoidal endofunctor to be more precise).
I’m sure there is a reason why the above is deficient, which is why I’d really direct you, if you’re looking for formalism, to the Moggi papers in particular.