compiler-construction - Haskell 编译器如何处理 'where' 语句?

标签 compiler-construction haskell ghc

在下面的函数中,我想知道编译器是否足够聪明来计算出 x将保持不变,还是会为列表中的每个项目计算列表的头部? (我正在使用 GHC)

allSame :: Eq a => [a] -> Bool 
allSame xs = all (==x) xs  where x = head xs

最佳答案

GHC 中“where”的语义是为“x”分配一个闭包并在所有用途之间共享。将为函数 (== 'x') 生成一个新的闭包,优化器会将其浮出,以便每次遍历仅生成一次。

要准确查看生成的代码,请检查核心(例如通过 ghc-core)。 GHC 将代码优化为:

M.allSame a eq xs =
    all
      (let 
         ds =
           case xs of 
             []   -> error "bad head"
             x : _-> x
            in
          \y -> x == y
         ) xs

如果性能是一个问题,请考虑使用向量,因为单独的遍历将融合,从而消除递归。

关于compiler-construction - Haskell 编译器如何处理 'where' 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3581381/

相关文章:

haskell - Haskell的模式匹配中是否对 "List"进行了特殊处理?

haskell - 为什么我无法替换使用 GHC 分发的库?如果我这样做会发生什么?

optimization - 已知回路跳闸次数的优化可能性

c++ - Eclipse 作为 Linux 和 Windows 上的 C++ 代码的跨平台 IDE

终端中的 Python 编译

c++ - 如何在 eclipse makefile 项目的编译器选项中设置 -std=c++0x?

haskell - 如何在 GHCI 中查找多个导入方法的类型签名

haskell - 为什么我不能在 ghci 中定义新类型?

haskell - ghc 8.0 cabal 构建错误 "ld: -r and -pie may not be used together"已知吗?

debugging - Haskell 程序输出 `<<loop>>`