昨晚,我正在编写一些娱乐性代码,在某个时候,我用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)