
Tomasz Zielonka wrote:
On Tue, May 15, 2007 at 06:55:11AM -0700, Conal Elliott wrote:
You could also use mappend instead of concatStmts and keep the Database -> IO () representation. - Conal
You mean using the (Monoid b) => Monoid (a -> b) instance ? I can see that IO () makes a perfect Monoid, but there doesn't seem to be a standard instance for that.
Indeed, all Monads are Monoids (that is, if m :: * -> * is a Monad, then m a :: * is a Monoid, for any fixed type a) by using >>. MonadPlusses have a Monoid structure at each particular fixed type, using mplus, but it's not the same one in all but the most trivial case. E.g: Prelude System.IO Control.Monad> Just 3 >> Nothing Nothing Prelude System.IO Control.Monad> Just 3 `mplus` Nothing Just 3 The general point here is that an awful lot of things are Monoids, often in more than one way. There isn't a really elegant way to choose which instance you want, though. newtype hackery is one way to partition them, although it might be nicer (?) to have a more general notion of 'naming instances'. Jules