2013-09-23 57 views
3

我已經學了Haskell一段時間了,但IO monad卻嚇壞了我。 我有一個代碼IO計算順序

main = do 
    putStrLn "First computation starts" 
    let firstResult = foo -- foo is a pure function 
    putStrLn "Second computation starts" 
    let secondResult = bar foo -- bar is too pure function 
    writeFile secondResult 

而看到"First computation starts""Second computation starts"然後程序會做。

我知道有絢麗的計算,當writeFile執行時真的開始計算。 我嘗試添加嚴格

main = do 
    putStrLn "First computation starts" 
    let !firstResult = foo -- foo is a pure function 
    putStrLn "Second computation starts" 
    let !secondResult = bar foo -- bar is too pure function 
    writeFile secondResult 

什麼也沒有發生

好吧,也許讓表情只是同義詞和由編譯器交換?我試圖把功能集成到IO

main = do 
putStrLn "First computation starts" 
!firstResult <- return (foo) -- foo is a pure function 
putStrLn "Second computation starts" 
!secondResult <- return (bar foo) -- bar is too pure function 
writeFile secondResult 

然而,結果是上面一樣,目前還不清楚我。

回答

5

如果你想確定一些東西已經評估過,deepseq是你的朋友。無論foo是什麼,您都必須實施NFData,但這通常很容易。您的main將會變成

main = do 
    putStrLn "First computation starts" 
    firstResult <- return $!! foo 
    putStrLn "Second computation starts" 
    secondResult <- return $!! bar foo 
    writeFile secondResult