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