在 Haskell 中我们有一个函数 readFile::FilePath -> IO String
。我在理解 monad 时的问题是为什么将它包装在 IO
中?我们不能只写这样的函数吗:
(lines.readFile) path
而不是
(readFile >>= lines) path
IO 包装器有什么好处?
最佳答案
Haskell 表达式是 referentially transparent .这意味着如果 readFile
真的有一个 FilePath -> String
类型,那么表达式 readFile "a.txt"
总是会产生相同的结果结果。即使您读取文件,然后更改它,然后再次读取,您也会获得其第一个状态的内容。
因此,我们需要区分值和操作,这就是IO
的作用。它不允许您在其他表达式中使用结果 readFile "a.exe"
,直到您执行 与之关联的操作。因此,更改文件后,您必须再次执行读取操作以获取文件内容,因此您将能够看到更改。
关于haskell - 为什么在 IO Monad 中包装 IO 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41096040/