
On Mon, Dec 12, 2011 at 10:00:35AM -0500, Dean Herington wrote:
At 9:04 PM +1000 12/12/11, Ben Kolera wrote:
There is some magic here that I'm not quite groking. Sorry for my slowness; but I seem to be missing a step:
Oops, my bad! The magic is an inadequate test ;-). Thanks for spotting the bug!
The magic I was trying to leverage is this instance from Data.Monoid:
instance Monoid a => Monoid (Maybe a) where mempty = Nothing Nothing `mappend` m = m m `mappend` Nothing = m Just m1 `mappend` Just m2 = Just (m1 `mappend` m2)
Just to provide a bit of perspective at this point: the reason this Monoid instance for (Maybe a) can't be used is because it requires a to be an instance of Monoid... but numbers under min/max DON'T form a Monoid since there is no identity element. In fact, that's the very reason why we wanted to use Maybe in the first place! I therefore consider this Monoid instance for Maybe "broken". What we really want is instance Semigroup a => Monoid (Maybe a) where ... A semigroup is a set with an associative binary operation (but not necessarily an identity element). Maybe turns any semigroup into a monoid by adding a "synthetic" identity element (namely, Nothing). In fact, such an instance is provided in the 'semigroups' package on Hackage (except for a type called Option instead of Maybe). Maybe someday we will get semigroups defined in 'base'. That would be nice. -Brent