在教程中https://markkarpov.com/tutorial/ghc-optimization-and-fusion.html#fusion-without-rewrite-rules是一個代碼示例,不會通過 fusion 進行優化。
map0 :: (a -> b) -> [a] -> [b]
map0 _ [] = []
map0 f (x:xs) = f x : map0 f xs
foldr0 :: (a -> b -> b) -> b -> [a] -> b
foldr0 _ b [] = b
foldr0 f b (a:as) = foldr0 f (f a b) as
nofusion0 :: [Int] -> Int
nofusion0 = foldr0 ( ) 0 . map0 sqr
sqr :: Int -> Int
sqr x = x * x
foldr0 ( ) 0 . map0 sqr我的問題是:如果編譯器可以輕松證明 map0 不會改變資料結構維度并推斷從結構向上到結構向下運行的所有內容,為什么函式不會自動行內到一個遞回中?我還是想不通,為什么這種代碼不重寫規則就不能自動優化。
您知道任何具體原因,為什么不使用此優化?
謝謝。
uj5u.com熱心網友回復:
我認為可以優化您的示例的最有希望的方法稱為超級編譯。有一篇關于惰性函式語言的超級編譯的論文:https ://www.microsoft.com/en-us/research/publication/supercompilation-by-evaluation/ 。
在論文的未來作業部分,作者指出:
在實踐中使用超級編譯的主要障礙是代碼膨脹和編譯時間。
已經有嘗試將超級編譯集成到 GHC 中的作業,但尚未成功。我不知道所有細節,但有一個非常技術性的 GHC wiki 頁面:https ://gitlab.haskell.org/ghc/ghc/-/wikis/supercompilation 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431371.html
