On Wed, Nov 18, 2009 at 7:43 AM, Ben Millwood <hask...@benmachine.co.uk>wrote:

> It looks quite neat to use the Maybe monoid here:
>
> > import Data.Monoid
> > searchList p = foldr (\x -> if p x then mappend (Just [x]) else id)
> Nothing
>
> but it seems that the Maybe Monoid instance keeps this strict. I
> fiddled with this a bit, and came up with the following:
>
> > instance (Monoid m) => Monoid (Maybe m) where
> >  mempty = Nothing -- as usual
> >  mappend (Just x) y = Just $ mappend x (fromMaybe mempty y)
> >  mappend Nothing y = y
>

The existing Monoid instance for 'Maybe a' lifts what is logically a
Semigroup into a Monoid by extending the domain of the operation with a unit
(Nothing). Alas, This is annoyingly not the same behavior as the MonadPlus
behavior for Maybe, unlike all of the other cases where MonadPlus and Monoid
happen to exist in a manner in which they coincide, and since there is no
Semigroup class, it lies and claims that it transforms Monoid m => Monoid
(Maybe m).

Your version uses mempty from the underlying monoid, so it would break any
code that relied on the existing 'lifted Semigroup' interpretation of the
Maybe Monoid, which safely operate lift Semigroups-that-claim-to-be-Monoids
where mempty = undefined

-Edward Kmett
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to