3

私は Haskell をしばらく学んでいましたが、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 

何も起こりません

let 式は単なるシノニムであり、コンパイラによって交換されるのでしょうか? 私は関数をに変えようとします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 

それにもかかわらず、結果は上記と同じです。私には不明です。

4

1 に答える 1

5

何かが評価されていることを確認したい場合は、deepseqが役に立ちます。NFData何に対しても実装する必要がありますfooが、これは通常は簡単に実行できます。あなたmainはその後になるでしょう

main = do
  putStrLn "First computation starts"
  firstResult <- return $!! foo
  putStrLn "Second computation starts"
  secondResult <- return $!! bar foo
  writeFile secondResult 
于 2013-09-23T16:39:06.060 に答える