Рассматривая определение Monoid
, я заметил, что mconcat
имеет следующее определение ( источник ):
mconcat :: Monoid a => [a] -> a
mconcat = foldr mappend mempty
Почему подпись ограничивает это значение [a]
, а не более обобщенным c Foldable
, как это?
mconcat' :: (Foldable t, Monoid a) => t a -> a
mconcat' = foldr mappend mempty
Это по историческим причинам? Или эта более общая реализация c усложнит для определенных типов c предоставление ее оптимизированной версии, как, например, для []
, который использует понимание списка ( source )?