【发布时间】:2012-09-03 04:29:09
【问题描述】:
我们可以在表达式中融合两个遍历列表xs
(map f xs, map g xs)
像这样
unzip (map (\x -> (f x, g x)) xs)
有没有关于自动执行这种融合的研究?
(如果其中一个返回的列表先于另一个被消耗,则存在空间泄漏的风险。我更感兴趣的是防止对xs 的额外遍历而不是节省空间。)
编辑:我实际上并不打算将融合应用到实际的内存中 Haskell 列表中,根据 unzip 是否可以与其消费者融合,这种转换可能没有意义。我有一个我知道unzip 可以融合的设置(请参阅“FlumeJava:简单、高效的数据并行管道”)。
【问题讨论】:
-
不是自动的,但还是不错的:squing.blogspot.com/2008/11/beautiful-folding.html
-
除非这个结果与其他东西融合,否则创建对和解压缩它们的开销将大于额外遍历的成本。
-
@augustss 如果遍历是在一个巨大的文件上,则不会!我不打算将其应用于实际列表。
-
解压缩将遍历与地图长度相同的列表,因此您不会保存遍历。现在,如果您关心节省融合为您提供的空间,那么它可以产生巨大的影响。我从你的评论中推断出你对太空不感兴趣,但我发现这并不是你所说的。 :)
-
“防止对 xs 的额外遍历”也可以通过大多数迭代器样式的包来实现。