2.5 ZIO类型别名
ZIO的三个类型参数,功能极为强大。我们可以使用环境类型参数进行参数注入(数据库,连接池,配置等),并且可以使用错误和成功类型参数返回结果。
在最常见的情况下,程序需要向下传播依赖关系,并向上返回结果,而ZIO将所有这些都提供给类型安全的程序包。
但是有时候,我们可能不需要所有这些功能。我们可能知道应用程序不需要外部环境,或者只能因某种类型的错误而失败,或者根本不会失败。
为了简化这些情况,ZIO附带了许多有用的类型别名。如果您不想,则不必使用这些类型别名。您始终可以只使用完整的ZIO类型签名。但是这些类型别名在ZIO代码库中经常使用,因此熟悉它们很有帮助,并且如果您选择使用它们,它们可以使您的代码更具可读性。
这些类型如下:
type IO[+E, +A] = ZIO[Any, E, A]
type Task[+A] = ZIO[Any, Throwable, A]
type RIO[-R, +A] = ZIO[R, Throwable, A]
type UIO[+A] = ZIO[Any, Nothing, A]
type URIO[-R, +A] = ZIO[R, Nothing, A]
下面是一个简单的关于类型别名的描述,可以帮助你记住他们:
-
IO[E, A] - 这种类型代表的effect 不需要环境,可能以E失败,也可能成功返回一个A
-
Task - 这种类型的effect不需要任何环境,可能会以抛出Throwable 失败,也可能以返回A成功。Task类似Future,可以直接运行
-
UIO - 这是Task的一种特殊情况,不需要依赖,也不会失败, 只返回一个A
-
RIO - 这个和Task不同的地方在于需要一个参数R才能生存可以直接运行的程序。可以理解为一个返回这为Task的函数,而R为参数。
-
URIO[R, A] - 这是RIO的特例,特殊的地方在于他不会失败
译者注: IO是最高级别的抽象。Task类似Future,RIO是生成Task的函数,RIO 注入 环境就可以生成一个Task. URIO是RIO的特例,UIO是Task的特例,他俩都不会失败.
ZIO和ZIO生态系统中的其他库中的其他几种数据类型也使用类似的类型别名,因此,如果您熟悉这些别名,则也可以很快将其取用。
ZIO随附了每种类型别名的伴随对象,因此您可以使用对ZIO本身的相同方式调用具有这些类型别名的静态方法。
例如,这两个定义是等效的,并且都是有效的语法:
import zio._
val first: ZIO[Any, Nothing, Unit] = ZIO.effectTotal(println("Going to the grocery store"))
val second: UIO[Unit] = UIO.effectTotal(println("Going to the grocery store"))
ZIO致力于全面实现出色的类型推断,但在极少数必须显式指定类型参数的情况下,伴随对象上的构造函数可能需要较少的类型参数(例如,UIO上的构造函数没有错误参数),因此它们可以改善类型推断 和人体工程学。