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

10-09 17:14