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
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to