我正在使用 ZIO:https://github.com/zio/zio https://github.com/zio/zio
in my 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
}
首先,我想也许管道被执行了,但没有重新计算的值,但我也不工作。
我希望能够异步计算我的值并能够重用它们。
我在看如何让 Scalaz ZIO 变懒? https://stackoverflow.com/questions/53851349/how-do-i-make-a-scalaz-zio-lazy/53869931#53869931但它对我也不起作用。
ZIO has memoize https://static.javadoc.io/dev.zio/zio_2.12/1.0.0-RC9-4/zio/ZIO.html#memoize:zio.ZIO%5BR,Nothing,zio.IO%5BE,A%5D%5D,它基本上应该做你想要的。我现在没有办法测试它,但它应该像这样工作:
for {
memoized <- t.memoize
tt1 <- memoized
tt2 <- memoized
} yield tt1 + tt2
请注意,除非实际代码的第二行和第三行有一些分支,否则可能会导致Task
永远不会被调用,或者只被调用一次,这会产生与更简单的相同的答案和副作用:
t flatMap {tt => tt + tt}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)