3

我学习 Haskell 已经有一段时间了,但是 IO monad 还是吓到了我。我有一个代码

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 回答