Proposal: Max and Min for Monoid (ticket # 1952)

Conal Elliott conal at conal.net
Sun Dec 2 12:57:50 EST 2007


I'd like to add two instances to Data.Monoid, alongside of All/Any,
Sum/Product, and First/Last.

Here's a current instance (as a style example):

-- | Boolean monoid under conjunction.
newtype All = All { getAll :: Bool }
	deriving (Eq, Ord, Read, Show, Bounded)

instance Monoid All where
	mempty = All True
	All x `mappend` All y = All (x && y)

My proposed addition:

-- | Ordered monoid under 'max'.
newtype Max a = Max { getMax :: a }
	deriving (Eq, Ord, Read, Show, Bounded)

instance (Ord a, Bounded a) => Monoid (Max a) where
	mempty = Max minBound
	Max a `mappend` Max b = Max (a `max` b)

-- | Ordered monoid under 'min'.
newtype Min a = Min { getMin :: a }
	deriving (Eq, Ord, Read, Show, Bounded)

instance (Ord a, Bounded a) => Monoid (Min a) where
	mempty = Min minBound
	Min a `mappend` Min b = Min (a `min` b)


I have a niggling uncertainty about the Ord & Bounded instances for Min a?
Is there a reason flip the a ordering instead of preserving it?

Suggested review period: two weeks (ending December 16).

Comments?

  - Conal
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/libraries/attachments/20071202/c9b2f9d5/attachment.htm


More information about the Libraries mailing list