让构造优化列表理解吗?

时间:2019-02-24 10:54:32

标签: haskell optimization compiler-optimization

我应该写一个对列表理解块中的元素求和的函数。

让我们以这两个功能为例:

preg_replace

问题:

  • 第二个函数是x和y相加两次而不是第一个函数吗?
  • 如果没有,它如何工作?

1 个答案:

答案 0 :(得分:7)

第二个函数将计算总和两次–此处无需进行显式共享,Haskell也不执行备注(来源:When is memoization automatic in GHC Haskell?

let允许一次计算总和并在多个地方使用,因此第一个函数会稍微更快。


编辑:

在评论中有人提到CSE(常见子表达式消除)可能是此处可能发生的优化。我尝试使用-ddump-cse编译您的函数来发现它是否会发生,但是尽管我没有提到normalSum,但输出对我来说太神秘了。但是,如果您构建的函数没有-O*标志,我的回答应该是正确的。如果我找到答案,将会更新我的答案。