簡體   English   中英

在GHC中,非尾部函數轉換為CPS嗎?

[英]In GHC are non-tail functions transformed to CPS?

這段代碼在“了解您的Haskell”中用於說明(++)如何用於在右側而不是左側建立列表的情況下效率低下:

import Control.Monad.Writer  

gcdReverse :: Int -> Int -> Writer [String] Int  
gcdReverse a b  
    | b == 0 = do  
        tell ["Finished with " ++ show a]  
        return a  
    | otherwise = do  
        result <- gcdReverse b (a `mod` b)  
        tell [show a ++ " mod " ++ show b ++ " = " ++ show (a `mod` b)]  
        return result  

既然我們不在這里進行尾遞歸,那么假設在編譯過程中GHC將把這個函數轉換成CPS風格的函數是正確的嗎? 如果實際上正在發生這種轉換,那么我可以從所有Haskell編譯器中期待它,還是GHC。

我知道此函數效率不高,因為它以錯誤的方式附加了列表,但我只是想確保不會導致堆棧溢出。

不,GHC不進行CPS轉換。 盡管針對懶惰語言的CPS轉換存在變體,但我不知道對於實際上執行CPS轉換的惰性語言沒有編譯器。

你是對的,因為CPS轉換可以交換堆空間用於堆空間,但是一些采用CPS轉換的編譯器專門處理延續,以便它們有效地獲得堆分配堆棧,因此無論如何你都會得到堆棧溢出。 我認為這是一件好事,因為它有助於調試。 而且,對於堆分配堆棧,GHC也會這樣做,沒有CPS轉換。 這就是它處理輕量級線程實現的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM