GHC `elem` 优化
GHC `elem` optimization
考虑 LYAH 的以下函数:
removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']]
GHC 会优化 elem
测试吗?例如。通过使用哈希 table。如果谓词列表很大,这样的优化就变得很有必要,而且必须手动执行此操作会很烦人,例如通过构造一个 Data.set
或任何它所谓的东西。
如果您使用 -O2 -ddump-simpl -dsuppress-all
使用 GHC 8.0.2 编译它,您可以自己看到 elem
测试没有进行优化:
lvl_r21d = eftChar 65# 90#
removeNonUppercase_go =
\ ds_a1Vs ->
case ds_a1Vs of _ {
[] -> [];
: y_a1Vx ys_a1Vy ->
case elem $fEqChar y_a1Vx lvl_r21d of _ {
False -> removeNonUppercase_go ys_a1Vy;
True -> : y_a1Vx (removeNonUppercase_go ys_a1Vy)
}
}
removeNonUppercase = \ st_aqk -> removeNonUppercase_go st_aqk
考虑 LYAH 的以下函数:
removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']]
GHC 会优化 elem
测试吗?例如。通过使用哈希 table。如果谓词列表很大,这样的优化就变得很有必要,而且必须手动执行此操作会很烦人,例如通过构造一个 Data.set
或任何它所谓的东西。
如果您使用 -O2 -ddump-simpl -dsuppress-all
使用 GHC 8.0.2 编译它,您可以自己看到 elem
测试没有进行优化:
lvl_r21d = eftChar 65# 90#
removeNonUppercase_go =
\ ds_a1Vs ->
case ds_a1Vs of _ {
[] -> [];
: y_a1Vx ys_a1Vy ->
case elem $fEqChar y_a1Vx lvl_r21d of _ {
False -> removeNonUppercase_go ys_a1Vy;
True -> : y_a1Vx (removeNonUppercase_go ys_a1Vy)
}
}
removeNonUppercase = \ st_aqk -> removeNonUppercase_go st_aqk