haskell - 为什么在 IO Monad 中包装 IO 结果

标签 haskell monads

在 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/

相关文章:

haskell - 我应该在 Turtle 或 Foldl 包中使用折叠吗?

haskell - 使用简单求和类型的所有值构造 n 元乘积

haskell - "higher order Traversable"类应该是什么样的?

haskell - 迭代 + 永远 = iterateM?使用反馈重复操作

scala - 仿函数的目的

haskell - 为什么这个 Haskell 表达式得不到结果?

haskell - Haskell 中的 As (@) 模式

haskell - 如何理解 Haskell 的 "1.2 % 3.4"错误消息?

Haskell:无法弄清楚如何使用 monad 变压器堆栈

haskell - 绑定(bind)来自哪里?