在 ZIO 中,有没有办法将 IO[Nothing, T] 转换为 T,如果没有,为什么不呢?
In ZIO, is there a way to transform an IO[Nothing, T] to T, and if not, why not?
考虑到错误并将 IO[E, T]
转换为 IO[Nothing, T]
之后,我们可以直接引用该值作为类型 T
而不是 IO[Nothing, T]
。这允许我们 return 类型 T
的值,而无需使用 var
和 IO.map
。有没有办法做到这一点,如果没有,为什么不呢?
在ZIO的当前README中没有找到解决方案。
无法实现采用 IO[Nothing, T]
和 returns T
.
的 纯 函数
之所以如此,是因为 ZIO IO[_, _]
的第一个类型参数描述了 错误 可能发生在 IO
-wrapped 计算中。 IO[Nothing, T]
描述了一个不会失败的计算,但它仍然封装了一个 side-effectful 计算。这就是为什么你不能在 pure 函数中获取 T
类型的值。
只是在谈论物理可能性,因为 Scala 不是一种纯语言,你有可能编写一个接受 IO[Nothing, T]
和 returns T
的函数,但你真的很气馁通过ZIO的设计和思想来做到这一点。
IO[E, T]
只是对可以 return 错误 E
或产生值 T
的程序的描述。
要实际产生这个值,您需要 运行 这个程序。
ZIO 的设计鼓励将不纯的副作用推到程序的最边缘,即 main
函数。事实上,您不需要在代码中的任何地方显式调用 unsafeRun
,因为 ZIO 的 App
特性会为您处理此问题。
也就是说,如果您仍然需要这样做,比如因为您还没有准备好重构整个应用程序,您可以使用 RTS
特征(RTS 代表 运行time系统)。
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。
对于所有在 2019 年寻找答案的人 - API 中有一个小的变化。
import scalaz.zio._
object RTS extends DefaultRuntime
class Service {
val program: UIO[String] = ???
def mixPureImpure: String = {
println("Calling service")
RTS.unsafeRun(program)
}
}
考虑到错误并将 IO[E, T]
转换为 IO[Nothing, T]
之后,我们可以直接引用该值作为类型 T
而不是 IO[Nothing, T]
。这允许我们 return 类型 T
的值,而无需使用 var
和 IO.map
。有没有办法做到这一点,如果没有,为什么不呢?
在ZIO的当前README中没有找到解决方案。
无法实现采用 IO[Nothing, T]
和 returns T
.
之所以如此,是因为 ZIO IO[_, _]
的第一个类型参数描述了 错误 可能发生在 IO
-wrapped 计算中。 IO[Nothing, T]
描述了一个不会失败的计算,但它仍然封装了一个 side-effectful 计算。这就是为什么你不能在 pure 函数中获取 T
类型的值。
只是在谈论物理可能性,因为 Scala 不是一种纯语言,你有可能编写一个接受 IO[Nothing, T]
和 returns T
的函数,但你真的很气馁通过ZIO的设计和思想来做到这一点。
IO[E, T]
只是对可以 return 错误 E
或产生值 T
的程序的描述。
要实际产生这个值,您需要 运行 这个程序。
ZIO 的设计鼓励将不纯的副作用推到程序的最边缘,即 main
函数。事实上,您不需要在代码中的任何地方显式调用 unsafeRun
,因为 ZIO 的 App
特性会为您处理此问题。
也就是说,如果您仍然需要这样做,比如因为您还没有准备好重构整个应用程序,您可以使用 RTS
特征(RTS 代表 运行time系统)。
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。
对于所有在 2019 年寻找答案的人 - API 中有一个小的变化。
import scalaz.zio._
object RTS extends DefaultRuntime
class Service {
val program: UIO[String] = ???
def mixPureImpure: String = {
println("Calling service")
RTS.unsafeRun(program)
}
}