【发布时间】:2019-11-18 12:14:22
【问题描述】:
我正在使用 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?,但它对我也不起作用。
【问题讨论】:
-
我不知道 Zio 是否有这样的能力(可能出于性能原因)。但是,重要的是您知道这样做会破坏 引用透明性 原则,从某种意义上说,这是使用任何类型的
IOMonad。如果您不关心这一点,而只想要异步计算,那么只需使用Future。 -
Monix
Task有memoize方法,也许改用它?
标签: scala functional-programming zio