Maximum and Minimum monoids

Roman Cheplyaka roma at ro-che.info
Thu Dec 27 21:25:10 CET 2012


Wouldn't it be better to have a real algebraic type instead of wrapping
Maybe?

Something like

  data Maximum a = MinusInfinity | Maximum a
  data Minimum a = PlusInfinity  | Minimum a

Maximum x is more concise than Maximum (Just x), and MinusInfinity is
more descriptive than Maximum Nothing. getMaximum/getMinimum functions
can still return Maybes.

Anyway, I'm +1 to having something along these lines.

Roman

* Gabriel Gonzalez <gabriel439 at gmail.com> [2012-12-27 12:45:42-0600]
> I don't know if this has been brought up before or not, but would it
> be possible to add the Maximum and Minimum monoids to Data.Monoid?
> The following implementations extend the traditional semigroups using
> Maybe.
> 
> ******
> 
> newtype Maximum a = Maximum { getMaximum :: Maybe a }
> 
> instance (Ord a) => Monoid (Maximum a) where
>     mempty = Maximum Nothing
> 
>     mappend (Maximum Nothing) m2 = m2
>     mappend m1 (Maximum Nothing) = m1
>     mappend (Maximum (Just a1)) (Maximum (Just a2)) = Maximum (Just
> (max a1 a2))
> 
> newtype Minimum a = Minimum { getMinimum :: Maybe a }
> 
> instance (Ord a) => Monoid (Minimum a) where
>     mempty = Minimum Nothing
> 
>     mappend (Minimum Nothing) m2 = m2
>     mappend m1 (Minimum Nothing) = m1
>     mappend (Minimum (Just a1)) (Minimum (Just a2)) = Minimum (Just
> (min a1 a2))
> 
> ******
> 
> These also give the correct behavior when folding empty structures by
> returning Nothing.
> 
> The reason I'm asking is that my `pipes` library uses `WriterT` to
> implement folds and having the above monoids lets me implement
> minimum and maximum folds elegantly.  I can always provide these
> monoids myself, but I feel like they belong in Data.Monoid.
> 
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries



More information about the Libraries mailing list