1

我一直在研究功能程序优化,并且一直在挖掘 GHC 源码。我(大部分)了解什么是 eta 缩减和 eta 扩展。Eta 减少只删除多余的 lambda:

\x -> abs x
=>
abs

Eta 扩展与 eta 减少相反,它会做这样的事情(如果我不正确,请纠正我):

abs
=>
\x -> abs x
-----------------------------------------------
foo = abs
=>
foo x = abs x
-----------------------------------------------
foo = bar 100
bar x y = x + y
=>
foo y = bar 10 y
bar x y = x + y
-----------------------------------------------
etc...

我没有得到的是他们如何不妨碍彼此并将编译器送入无限循环。例如,首先对一个值进行 eta 扩展,然后对它进行 eta 缩减,以此类推。那么,这两种优化如何不相互影响呢?

4

1 回答 1

0

我想我找到了答案。我从 GHC 的贡献者那里找到了一篇论文(不记得它叫什么了),其中提到 GHC 不做 eta 减少。相反,它会进行 eta 扩展和 beta 缩减 (IIRC);Beta 减少完成了大部分工作。

于 2020-10-30T00:30:44.717 回答