4
GHC是否可以像中间值一样有效地转换表达式?具有中间值的融合优化
例如
main = print $ f ["aa", "bb", "cc"]
f x =
let a = map (map toUpper) x
b = filter (\z -> 'C' /= head z) a
c = foldl1 (++) b
in c
似乎具有非常不同的核心输出(与-ddump-simple
)比用
f x = foldl1 (++) $ filter (\z -> 'C' /= head z) $ map (map toUpper) x
可以与中间值的表达式采取(显著)更长的时间来评价?
注意这是使用build/foldr融合,因为您使用的是默认的GHC列表实现。如果您需要流版本,请使用'stream-fusion'软件包。好处将是foldl1融合。 –
两个版本都为我提供了相同的内核,分别为7.6.1和7.2.2(使用'-O'和'-O2')。你使用了哪个版本和优化标志? –
@DanielFischer:我没有使用任何优化标志;我想知道的是“什么时候这些不等价”,而且看起来答案是“不使用优化标记时”。 – amindfv