在查看的定义时,Monoid
我注意到mconcat
具有以下定义(source):
mconcat :: Monoid a => [a] -> a
mconcat = foldr mappend mempty
为什么签名会将其限制为[a]
而不是像这样更通用Foldable
?
mconcat' :: (Foldable t, Monoid a) => t a -> a
mconcat' = foldr mappend mempty
这是出于历史原因吗?或者这种更通用的实现是否会使特定类型更难提供它的优化版本,例如[]
使用列表理解(source)的情况?