昨晚,我正在编写一些娱乐性代码,在某个时候,我用concatMap替换了>>=,并看到代码中的〜10%加速。

我的印象是>>=[]定义正是concatMap,因此我有些困惑。

最佳答案

在基本4.8中,(>>=)的实现(请参阅here)为:

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

concatMap使用的是更复杂的构建器(来源here)
concatMap :: Foldable t => (a -> [b]) -> t a -> [b]
concatMap f xs = build (\c n -> foldr (\x b -> foldr c b (f x)) n xs)

10-06 02:45