我正在使用 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/