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