Почему > >= быстрее, чем concatMap, когда они должны быть одинаковыми?

Вчера вечером я написал рекреационный код, и в какой-то момент я заменил concatMap на >>= и увидел в моем коде ускорение на 10%.

У меня создалось впечатление, что определение >>= для [] было ровно concatMap, поэтому я немного запутался.

Ответ 1

В базе реализована база 4.8 (>>=) (см. здесь) как:

xs >>= f = [y | x <- xs, y <- f x]

и concatMap использует более сложный построитель (источник здесь)

concatMap :: Foldable t => (a -> [b]) -> t a -> [b]
concatMap f xs = build (\c n -> foldr (\x b -> foldr c b (f x)) n xs)