【发布时间】:2016-08-05 11:31:38
【问题描述】:
我可以在 Haskell 中编写属于流融合的自己的地图函数吗?
为什么列表上的递归迭代不受融合的影响?这完全扼杀了 Haskell 模式匹配的良好表现力:foo (x:xx) ...!
Prelude 循环函数是否融合?
【问题讨论】:
-
Prelude.map,就像许多Prelude函数一样,需要构建/折叠融合,而不是流融合。这与流融合一样快,但涵盖的情况不同;特别是 build/foldr 融合不像concatMap这样的东西像流融合那样是病态的。 -
要查看融合是如何工作的,请参阅此处的地图临时重写为 github.com/ghc/ghc/blob/master/libraries/base/GHC/Base.hs#L926 这允许删除带有通常 foldr/build 规则的列表 github.com/ghc/ghc/blob/master/libraries/base/GHC/Base.hs#L849 如果生成的内部 foldr 不与构建融合,则一切都恢复为标准我们在这里看到的递归映射 github.com/ghc/ghc/blob/master/libraries/base/GHC/Base.hs#L927
-
仅供参考,这篇论文可读性很强:citeseer.ist.psu.edu/viewdoc/…
-
@Michael 有点跑题了:当所有循环操作都融合为一个时,是什么让文本比字符串快?
-
我不确定所有因素,但
Text提供了更紧凑、更紧凑的表示。当然,在某些情况下,如果第一个 Char 存在,则整个文本都存在这一事实会使它“变慢”。例如。T.readFile "/usr/share/dict/words >>= print . head会更慢并使用更多内存。
标签: haskell optimization iteration