2016-08-29 14 views
0

比方說,我有一個天真的實現功能如下:如何判斷在GHC中是否發生共同的子表達式消除?

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

我認爲「通過閱讀核心」就是答案。你爲什麼不想這樣做?你可以通過從'Debug.Trace'插入函數來猜測,但我不會依賴它。 – jberryman

+0

@jberryman是否有經驗法則表明可能或不可能優化哪些代碼? – rityzmon

+0

不相關的,但非確定性是用列表模型,而不是元組。 '二次方a c c = [ans1,ans2]其中...' – chepner

回答

3

使用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編譯此示出了在指示GHC沒有執行CSE跟蹤輸出既ans1ans2。如果在兩個地方都使用tr1,則會得到類似的 結果。

Haskell的維基提到GHC只在有限的情況下 執行CSE - (link) - 那建議您進行 它自己,如果你想確保它發生。

相關問題