gpt4 book ai didi

haskell - 为什么不懒惰

转载 作者:行者123 更新时间:2023-12-03 15:10:37 24 4
gpt4 key购买 nike

我仍在开始探索 Haskell。我知道这段代码在 IO 中“运行”单子(monad)。当它来自 l <- ...下一行,IO - bind叫做。

可以这样认为,因为 Haskell 是 懒惰 , l永远不会被评估。但是“bind”总是计算前一个命令,对吗?因为程序会产生“file-not-found”错误。

main = do
l <- mapM readFile [ "/tmp/notfound" ]
return ()

最佳答案

One could think that because Haskell is lazy, the l is never evaluated.



是的,它永远不会被评估。然而,由于 (>>=) 的定义在 IO , 行动 readFile "/tmp/notfound"被执行,这意味着运行时尝试打开文件。如果没有这样的文件,则会引发“找不到文件”错误。如果有这样的文件,它会被打开,但它的内容在被要求之前不会被读取。在上面,它们不是必需的,因此不会读取内容。

这里评估(甚至执行)的是产生 l 的操作。 .由于该文件不存在,因此会引发错误。

关于haskell - 为什么不懒惰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13663430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com