Почему для mconcat требуется список, а не Foldable?

Глядя на определение Monoid, я заметил, что < a href="https://hackage.haskell.org/package/base/docs/Prelude.html#v:mconcat" rel="noreferrer">mconcat имеет следующее определение (источник):

mconcat :: Monoid a => [a] -> a
mconcat = foldr mappend mempty

Почему подпись ограничивает это значение [a], а не более общим Foldable?

mconcat' :: (Foldable t, Monoid a) => t a -> a
mconcat' = foldr mappend mempty

Это по историческим причинам? Или эта более общая реализация затруднит для конкретных типов предоставление оптимизированной версии, как в случае, например. для [], который использует понимание списка (источник)?


person fphilipe    schedule 08.02.2020    source источник
comment
Старая версия foldr работала только со списками iirc.   -  person Willem Van Onsem    schedule 09.02.2020


Ответы (1)


Хотя я не знаю фактического обсуждения такого предложения, вот несколько возможных причин:

person duplode    schedule 08.02.2020
comment
Спасибо за этот список, действительно полезно! Только что понял, что мог бы найти fold сам, просто обманывает (Foldable t, Monoid m) => t m -> m. Я также наткнулся на интересную статью под названием Синонимы в базе, в которой перечислены этот и другие примеры. подобных функций. - person fphilipe; 09.02.2020