
In article <20051024094010.GA4888@soi.city.ac.uk>,
Ross Paterson
To recap: with Haskell's class system, we can have only one (->) instance, so we have to choose.
There are many possibilities: instance Monoid [a] where mempty = [] mappend = (++) instance Monoid (a -> a) where mempty = id mappend = (.) instance Monoid b => Monoid (a -> b) where mempty _ = mempty mappend f g x = f x `mappend` g x instance Monad m => Monoid (m ()) where mempty = return () mappend = (>>) instance MonadPlus m => Monoid (m a) where mempty = mzero mappend = mplus instance Arrow arr => Monoid (arr p p) where mempty = arr id mappend = (>>>) instance Monoid a => Monoid a where mempty = mempty mappend p q = mappend q p OK, so the last one's silly. But maybe Monoid should be a datatype rather than a class? -- Ashley Yakeley, Seattle WA