On Fri, 2009-01-23 at 13:39 -0800, George Pollard wrote:
> On Fri, 2009-01-23 at 21:30 +0000, Joachim Breitner wrote:
> > Hi,
> > 
> > Am Freitag, den 23.01.2009, 21:50 +0100 schrieb Henning Thielemann:
> > >   However our recent Monoid discussion made me think about mapM_, 
> > > sequence_, and friends. I think they could be useful for many monads if
> 
> > > they would have the type:
> > >   mapM_ :: (Monoid b) => (a -> m b) -> [a] -> m b
> > >    I expect that the Monoid instance of () would yield the same
> efficiency 
> > > as todays mapM_
> > 
> > will it? This is based on a naive, not well-founded understanding of
> > haskell evaluation, but looking at
> > > instance Monoid () where
> > >   mempty        = ()
> > >   _ `mappend` _ = ()
> > >   mconcat _     = ()
> > I’d assume that evaluating
> > > mapM_ (putStrLn) lotsOfLargeStrings
> > with your proposed mapM_ will leave a thunk equivalent to
> > > () `mappend` () `mappend` () `mappend`...
> > in memory until the mapM_ has completely finished, where each () is
> > actually an unevalutated thunk that still has a reference to one of the
> > elements in the lotsOfLargeStrings list.
> 
> Perhaps this is why the Monoid instance for () in GHC's source has the
> comment "should this be strict?" :)

It's easy to calculate the answer.

mempty `mappend` undefined = undefined (left identity monoid law)
The above definition doesn't meet this, similarly for the right identity
monoid law.  That only leaves one definition, () `mappend` () = () which
does indeed satisfy the monoid laws.

So the answer to the question is "Yes."  Another example of making
things as lazy as possible going astray.

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

Reply via email to