假设我有一个天真实现的功能:
quadratic a b c = (ans1, ans2)
where
ans1 = ((-b) + sqrt (b * b - 4 * a * c)) / (2 * a)
ans2 = ((-b) - sqrt (b * b - 4 * a * c)) / (2 * a)
有多个相同的子表达式。如果没有阅读核心,我怎么能告诉我们是否发生了常见的子表达式消除以及这个部分是什么?
答案 0 :(得分:4)
使用trace
可能会告诉您this SO question中的演示。
import Debug.Trace
quadratic a b c = (ans1, ans2)
where
ans1 = ((-b) + tr1 (sqrt (b * b - 4 * a * c))) / (2 * a)
ans2 = ((-b) - tr2 (sqrt (b * b - 4 * a * c))) / (2 * a)
tr1 = trace "ans1"
tr2 = trace "ans2"
main = print $ quadratic 1 10 3
使用-O2
或-O3
进行编译会在跟踪输出中显示ans1
和ans2
,表明GHC未执行CSE。你得到类似的
如果您在两个地方都使用tr1
,则会产生结果。
Haskell Wiki提到GHC仅在有限的情况下执行CSE 环境 - (link) - 并建议您执行 如果你想确保它发生,你自己。