1

在考虑错误并转换IO[E, T]为 an之后,IO[Nothing, T]我们可以直接将值称为 typeT而不是IO[Nothing, T]. 这允许我们返回一个类型的值,T而无需使用varand IO.map。有没有办法做到这一点,如果没有,为什么不呢?

在 ZIO 的当前 README 中没有找到解决方案。

4

3 回答 3

6

IO[E, T]只是对可以返回错误E或产生值的程序的描述T

要实际产生这个值,你需要运行这个程序。

ZIO 的设计鼓励将不纯的副作用推到程序的最边缘,即main函数。事实上,您不需要unsafeRun在代码中的任何地方显式调用,因为 ZIO 的Apptrait 会为您解决这个问题。

话虽如此,如果您仍然需要这样做,比如说因为您还没有准备好重构整个应用程序,您可以使用RTStrait(RTS 代表运行时系统)。

import scalaz.zio._

class SomeService extends RTS {

  val pureProgram: IO[Nothing, String] = ???

  // will throw if pureProgram returns error branch
  def impureMethod: String {
    println("Part of my program is pure, but not all of it")
    unsafeRun(pureProgram)
  }
}

有关其他运行方法,请参阅 ZIO RTS Scaladoc

于 2018-10-02T17:10:19.400 回答
4

没有办法实现一个接受和返回的函数。IO[Nothing, T]T

之所以如此,是因为 ZIO 的第一个类型参数IO[_, _]描述了在-wrapped 计算中可能发生的错误。描述了一个不会失败的计算,但它仍然封装了一个副作用计算。这就是为什么你不能在函数中获得类型之外的值。IOIO[Nothing, T]T

仅谈论物理可能性,由于 Scala 不是一种纯语言,您可以编写一个接受IO[Nothing, T]和返回的函数,T但 ZIO 的设计和意识形态确实不鼓励您这样做。

于 2018-08-22T12:54:19.333 回答
3

对于所有在 2019 年寻找答案的人来说——API 发生了微小的变化。

import scalaz.zio._

object RTS extends DefaultRuntime

class Service {
  val program: UIO[String] = ???

  def mixPureImpure: String = {
    println("Calling service")
    RTS.unsafeRun(program)
  }
}
于 2019-03-23T05:51:07.917 回答