在下面的簡單的代碼,即從二叉查找樹中刪除的元素的函數的定義的一部分:ghci的編譯器優化:調用具有相同參數的函數兩次
deleteB x (Node n l r) | x == n = Node (leastB r) l (deleteB (leastB r) r)
確實編譯器優化代碼所以它調用(B以上R)只有一次,好像它是:
deleteB x (Node n l r) | x == n = Node k l (deleteB k r)
where k = leastB r
?
換句話說,編譯器是否能夠理解,因爲參數r在函數deleteB的主體中沒有改變,所以調用相同函數(leastB)的結果不能給出不同的結果,因此計算兩次是沒有用的?
更一般地說,如果編譯器做了這種優化或者沒有驚人的計算器不存在,我該如何理解該編譯器?謝謝
GHC將不會這樣做:http://www.haskell.org/haskellwiki/GHC/FAQ#Does_GHC_do_common_subexpression_elimination.3F – user2407038