微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Haskell-减少Eta和扩大Eta

如何解决Haskell-减少Eta和扩大Eta

我一直在研究功能程序优化,并且一直在研究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减少可以完成大部分工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。