2.5 zio入门——ZIO类型别名

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上的构造函数没有错误参数),因此它们可以改善类型推断 和人体工程学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值