Почему > >= быстрее, чем 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)