While looking at the definition of Monoid
I noticed that mconcat
has the following definition (source):
mconcat :: Monoid a => [a] -> a
mconcat = foldr mappend mempty
Why would the signature limit this to [a]
rather than the more generic Foldable
like this?
mconcat' :: (Foldable t, Monoid a) => t a -> a
mconcat' = foldr mappend mempty
Is this for historical reasons? Or would this more generic implementation make it harder for specific types to provide an optimized version of it, as is the case e.g. for []
which uses list comprehension (source)?
foldr
only worked on lists iirc. – Florencio