Dear haskellers,
currently the instances are defined as
instance (Monoid a, Monoid b) => Monoid (a,b) where mempty = (mempty, mempty) (a1,b1) `mappend` (a2,b2) = (a1 `mappend` a2, b1 `mappend` b2)
However for some applications this isn't lazy enough, for example
-- | Build two lists by folding on a pair of `Endo` monoids. test = head $ appEndo (fst $ foldMap (f &&& f) [1..]) [] where f = Endo . (:)
never terminates because of the unnecessary pattern matching on the constructor
(,)
forces evaluation of the whole infinite list.I suggest to change all Monoid instances for tuples to be like
instance (Monoid a, Monoid b) => Monoid (a,b) where mempty = (mempty, mempty) ~(a1,b1) `mappend` ~(a2,b2) = (a1 `mappend` a2, b1 `mappend` b2) -- ^^^ ^^^
which fixes the problem.
Best regards,
Petr
_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://www.haskell.org/mailman/listinfo/libraries