Haskell - Eta 减少和 Eta 扩展
Haskell - Eta reduction and Eta expansion
一直在研究函数式程序优化,一直在研究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 进行缩减,等等。那么,这两个优化如何才能不互相妨碍呢?
我想我找到了答案。我从 GHC 的贡献者那里找到了一篇论文(不记得它叫什么了),其中提到 GHC 不会减少 eta。相反,它进行 eta 扩展和 beta 缩减 (IIRC); Beta 缩减完成了大部分工作。
一直在研究函数式程序优化,一直在研究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 进行缩减,等等。那么,这两个优化如何才能不互相妨碍呢?
我想我找到了答案。我从 GHC 的贡献者那里找到了一篇论文(不记得它叫什么了),其中提到 GHC 不会减少 eta。相反,它进行 eta 扩展和 beta 缩减 (IIRC); Beta 缩减完成了大部分工作。