摘要

ZIO是一个基于纯函数式编程的的异步并发库。

有关如何在纯函数编程中处理“效果“,比如输入输出的背景知识,请参阅此章节:背景知识.

ZIO 的核心是 ZIO,这是一种源自Haskell 的 IO monad的强大的效果类型。通过此数据类型,您可以通过简单的、类型安全的、可测试和可组合地的代码来解决复杂的问题。

ZIO

ZIO[R, E, A] 数据类型有三个参数:

  • R – Environment Type. 该效果通过一个类型 R 用以标示“环境”。如果此类型参数为Any,则表示对该效果没有要求,因为您可以使用任何值(例如单位值())。
  • E – Failure Type. 如果该类型有可能失败,以类型 E 来标示。有些应用中可以使用 Throwable. 如果该类型是 Nothing, 它标示该效果不可能失败,因为 Nothing 标示没有值可以提供。
  • A – Success Type. 该效果成功执行的返回类型标记为类型 A. 如果该类型参数返回 Unit, 这表示该效果没有产生有用的信息,如果返回的是 Nothing, 标示该效果将永远执行下去(直到失败为止)。

例如, 一个 ZIO[Any, IOException, Byte] 类型的效果表示它没有输入参数,可能导致 IOException 类型的失败,或成功返回 Byte 类型的返回值。

ZIO[R, E, A] 类型的值类似以下函数类型:

R => Either[E, A]

这个函数要求一个 R 类型的输入参数,将可能产生或者 E 类型的失败,或一个 A 类型的成功返回值。但是 ZIO 不完全等于是一个实际的函数,它是面向复杂的效果的模型,比如并发和并行效果。

类型别名

ZIO 数据类型是 ZIO 中唯一的效果数据类型.。但是,有一系列类型别名和伴随对象可以在不同情况下简化它的表达形式:

  • UIO[A] — 这是 ZIO[Any, Nothing, A] 的别名,它表示一个对输入类型没有要求,并且不可能失败,并且能够成功返回一个 A 类型返回值的效果。
  • URIO[R, A] — 这是 ZIO[R, Nothing, A] 类型的别名,它表示输入要求为  R 类型,并且不可能失败,并能攻成功返回 A 类型的效果。
  • Task[A] — 这是 ZIO[Any, Throwable, A]的别名,表示一个对输入类型没有要起,可能导致 Throwable 类型的失败,或成功返回 A 类型的效果。
  • RIO[R, A] — 这是 ZIO[R, Throwable, A] 的别名,它表示一个输入类型为 R,可能导致 Throwable 类型的计算失败,或成功返回 A 类型的效果.
  • IO[E, A] — 这是 ZIO[Any, E, A] 的别名,它表示对输入没有要求,并且可能导致 E 类型的失败,或成功返回 A 类型的效果。

这些别名都有一个伴随对象,并且这些对象具有可用于构造适当类型的值的方法。

如果您对函数的效果不熟悉,我们建议您从 Task 类型开始,它只有一个参数,并且与 Scala 标准库的 Future 最接近。

如果您正在使用 Cats Effect 库,则 RIO 类型可能会很有用,因为它允许您通过第三方库和应用程序对环境进行线程化。

无论您在应用程序中使用哪种类型的别名,UIO 都可用于描述不可能失败的效果,包括结果出自对错误的处理函数。

最后,如果您是经验丰富的函数式程序员,则建议直接使用 ZIO 数据类型,虽然您可能最终会在应用程序的不同部分中创建自己的类型别名。

下一步

如果您对ZIO数据类型及其类型别名系列感到满意,那么下一步就是学习如何 创建 effects.

Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP