gpt4 book ai didi

scala - 猫效应 IO monad 是如何真正起作用的?

转载 作者:行者123 更新时间:2023-12-03 23:01:52 25 4
gpt4 key购买 nike

我是函数式编程和 Scala 的新手,我正在查看 Cats Effect 框架并试图了解 IO monad 的作用。到目前为止,我所理解的是,在 IO block 中编写代码只是对需要完成的操作的描述,在您使用 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 来运行它。方法。

最佳答案

在您的特定示例中,我认为正在发生的事情是常规的命令式 Scala 编码不受 IO 的影响。 monad——它在 Scala 规则下正常运行。
当你运行时:

for {
_ <- x("1")
_ <- changeState("playing")
} yield ()
这立即调用 x .这与 IO 无关单子(monad);就是这样 for理解是定义的。第一步是评估第一个语句,以便您可以调用 flatMap在上面。
正如您所观察到的,您永远不会“运行”一元结果,因此 flatMap 的参数,一元延续,从不被调用,导致没有调用 changeState .这特定于 IO monad,例如 List monad 的 flatMap会立即调用该函数(除非它是一个空列表)。

关于scala - 猫效应 IO monad 是如何真正起作用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65228874/

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