私は 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
それにもかかわらず、結果は上記と同じです。私には不明です。