【发布时间】:2015-11-06 18:12:25
【问题描述】:
昨晚,我正在编写一些娱乐性代码,在某个时候,我将 concatMap 替换为 >>= 并看到我的代码加速了约 10%。
我的印象是>>= 对[] 的定义正是concatMap,所以我有点困惑。
【问题讨论】:
标签: performance list haskell ghc
昨晚,我正在编写一些娱乐性代码,在某个时候,我将 concatMap 替换为 >>= 并看到我的代码加速了约 10%。
我的印象是>>= 对[] 的定义正是concatMap,所以我有点困惑。
【问题讨论】:
标签: performance list haskell ghc
【讨论】:
Foldable 也是Alternative 等同于Monad....
bind' fa f = foldr (<|>) empty $ foldr (:) [] (fmap f fa) 其中bind' :: (Foldable f, Applicative f) => f a -> (a -> f b) -> f b。 QED。
foldr (:) [] 抛弃了被折叠事物的所有结构,因此bind' m return === m 对许多其他守法的Foldable+Alternatives 来说失败了。即使您跳过它并定义bind' fa f = foldr (<|>) empty (fmap f fa),我也会有同样的担忧——foldr (<|>) empty v 的“形状”可能与v 不同。
t 被称为[] 时,为什么concatMap 不专门用于更高效的版本? (也许只是图书馆作者的疏忽?)