我寫了這段代碼,
import System.FilePath ((</>))
fp = "/Users/USER/Documents/Test/"
fpAcc = fp </> "acc.txt"
paths = map (fp </>) ["A.txt", "B.txt", "C.txt"]
main :: IO ()
main =
writeFile fpAcc ""
>> return paths
>>= mapM_ ((appendFile fpAcc =<<) . readFile)
>> readFile fpAcc >>= putStrLn
這是 的定義mapM_:
mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()
mapM_ f = foldr c (return ())
-- See Note [List fusion and continuations in 'c']
where c x k = f x >> k
{-# INLINE c #-}
運算式是mapM_ ((appendFile fpAcc =<<) . readFile)對磁盤產生 3 次寫入操作,還是由于某種 GHC 優化,只有一次?
如果編譯器可以生成代碼,該代碼使用中間記憶體來保存附加資料,然后只寫一次,那就太好了。但是,由于mapM_將結構的每個元素映射到一個單子動作,也許每個步驟都執行一個寫操作。
uj5u.com熱心網友回復:
不,這沒有優化。您撰寫的代碼將為路徑中的每個元素打開fpAcc、寫入一些位元組并關閉fpAcc一次。實際上,編譯器對此進行優化是不正確的:從程式外部可以觀察到打開和關閉檔案,因此僅打開檔案一次的優化將是一種行為變化,而不僅僅是速度變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/462855.html
下一篇:狀態機的索引單子
