当它们应该是同一个东西时,为什么>> =比concatMap更快?

Emi*_*mil 11 performance haskell list ghc

昨晚,我正在编写一些娱乐代码,并且在某些时候我更换了一个concatMap,>>=并且在我的代码中看到了大约10%的加速.

我的印象是对于>>=for 的定义[]是完全正确的concatMap,所以我有点困惑.

erd*_*szt 8

在基础4.8 (>>=)中实现(见这里):

xs >>= f = [y | x <- xs, y <- f x]
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)