首先,公共子表达式消除(CSE)意味着如果表达式出现在多个位置,则重新排列代码,以便仅计算该表达式的值一次.例如:
Run Code Online (Sandbox Code Playgroud)foo x = (bar x) * (bar x)可能会变成
Run Code Online (Sandbox Code Playgroud)foo x = let x' = bar x in x' * x'因此,bar函数只被调用一次.(如果bar是一个特别昂贵的功能,这可能会节省很多工作.)GHC实际上并不像你期望的那样经常执行CSE.问题是,执行CSE会影响程序的严格性/懒惰性.所以GHC确实做了CSE,但仅在特定情况下---参见GHC手册.(部分??)
长话短说:"如果你关心CSE,那就亲手做吧."
我想知道在什么情况下CSE"影响"程序的严格/懒惰以及可能产生什么样的影响.