Haskell 州黑客:为什么eta扩展州兰姆达斯对性能很重要?

Haskell 州黑客:为什么eta扩展州兰姆达斯对性能很重要?,haskell,ghc,Haskell,Ghc,GHC-O会因为“状态黑客”而导致一些程序的严重悲观。为什么“国家黑客”(即eta扩张国家#lambdas)对其他人的表现如此重要 参考资料: 通常,如果您编写一个函数,如foo1=\x->let-priced=。。在\y->..中,您将获得比foo2=\x y->let priced=。。在..中。但是,如果y::RealWorld#则它不携带任何信息(即不有用),因此\y不是“真正的”lambda(在堆栈上推送y的值总是无用的;它无论如何都不可能被使用)。foo1的操作语义如下:输入

GHC
-O
会因为“状态黑客”而导致一些程序的严重悲观。为什么“国家黑客”(即eta扩张国家#lambdas)对其他人的表现如此重要

参考资料:


通常,如果您编写一个函数,如
foo1=\x->let-priced=。。在\y->..
中,您将获得比
foo2=\x y->let priced=。。在..
中。但是,如果
y::RealWorld#
则它不携带任何信息(即不有用),因此
\y
不是“真正的”lambda(在堆栈上推送
y
的值总是无用的;它无论如何都不可能被使用)。
foo1
的操作语义如下:输入
\x
;为
昂贵的
创建一个thunk;输入
\y
。对于
foo2
:同时输入
\x y
;为
昂贵的
创建一个thunk。基本上,状态黑客在每个
IO
操作中保存一个额外的函数调用,如果该
IO
操作实际上是通过将一个函数应用于一个值来构造的,则该操作由一个
>=
分隔。例如,状态黑客对
f0>>f1>>f2
没有性能提升,但是对于
f0>=\x0->f1 x0>=\x1->f2 x0 x1
它可以避免输入两个函数(这通常成本很小,所以不会有太多的优化;但是当你知道这个参数不可能被使用,并且你有很多这样的函数调用时,它就加起来了!)我鼓励你发布一个答案!根据我目前的理解,“状态黑客”的存在是因为GHC无法区分“一次性”优化后速度总是更快的lambda(一个thunk,而不是两个),而另一个lambda总是受到影响,因为它们无法获得由“let”关键字引入的thunk,因此必须重复此计算。