gpt4 book ai didi

scala - ZIO : How to compute only once?

转载 作者:行者123 更新时间:2023-12-02 07:17:39 25 4
gpt4 key购买 nike

我正在使用 ZIO:https://github.com/zio/zio

在我的 build.sbt :

"dev.zio" %% "zio" % "1.0.0-RC9"

无论我尝试过什么,每次我需要的时候都会计算我的结果:
val t = Task {
println(s"Compute")
12
}

val r = unsafeRun(for {
tt1 <- t
tt2 <- t
} yield {
tt1 + tt2
})

println(r)

对于此示例,日志如下所示:
Compute
Compute
24

我试过 Promise :

val p = for {
p <- Promise.make[Nothing, Int]
_ <- p.succeed {
println(s"Compute - P")
48
}
r <- p.await
} yield {
r
}

val r = unsafeRun(for {
tt1 <- p
tt2 <- p
} yield {
tt1 + tt2
})

我遇到了同样的问题:
Compute - P
Compute - P
96

我试过
    val p = for {
p <- Promise.make[Nothing, Int]
_ <- p.succeed(48)
r <- p.await
} yield {
println(s"Compute - P")
r
}

首先,我在想,也许执行了管道,但没有重新计算值,但我也不起作用。

我希望能够异步计算我的值并能够重用它们。
我看了 How do I make a Scalaz ZIO lazy?但它对我也不起作用。

最佳答案

计算结果有副作用吗?如果没有,你可以只使用一个普通的旧惰性 val,也许被提升到 ZIO .

lazy val results = computeResults()
val resultsIO = ZIO.succeedLazy(results)

如果它确实有副作用,你就不能真正缓存结果,因为那不会是引用透明的,这就是 ZIO 的重点。 .
您可能需要做的是 flatMap在您的计算机上 Task并编写程序的其余部分,该程序需要在对 flatMap 的调用中获得该计算的结果。 ,线程 result必要时通过函数调用将值作为参数。
val compute = Task {
println(s"Compute")
12
}

compute.flatMap { result =>
// the rest of your program
}

关于scala - ZIO : How to compute only once?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56944089/

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