我是函数式编程和 Scala 的新手,我正在查看 Cats Effect 框架并试图了解 IO monad 的作用。到目前为止,我所理解的是,在 IO 块中编写代码只是对需要完成的操作的描述,并且在您使用unsafe
提供的方法显式运行之前什么都不会发生,并且也是一种制作参考执行副作用的代码的方法实际上不运行它是透明的。
我尝试执行下面的代码片段只是为了理解它的含义:
object Playground extends App {
var out = 10
var state = "paused"
def changeState(newState: String): IO[Unit] = {
state = newState
IO(println("Updated state."))
}
def x(string: String): IO[Unit] = {
out += 1
IO(println(string))
}
val tuple1 = (x("one"), x("two"))
for {
_ <- x("1")
_ <- changeState("playing")
} yield ()
println(out)
println(state)
}
输出是:
13
paused
我不明白为什么赋值state = newState
不运行,但增量和赋值表达式out += 1
运行。我是否遗漏了一些关于这应该如何工作的明显内容?我真的可以使用一些帮助。我知道我可以使用这些unsafe
方法来运行它。