Cats Effect

interop-cats 模块提供了与 Cats Effect 生态系统之间的互操作性。

要使用此模块,请将以下内容添加到 build.sbt 中:

libraryDependencies += "dev.zio" %% "zio-interop-cats" % "<version>"

大多数互操作功能包含在以下程序包中:

import zio.interop.catz._

Cats Effect 实例

ZIO 通过提供 Cats Effect 类型类的实例与 Typelevel 库集成。fs2,doobie 和http4s 以及函数式 Scala 生态系统中的各种其他库都使用这些类型类。

由于 Cats Effect 的限制,ZIO 无法提供任意错误类型的实例。相反,您只能获得它的错误类型扩展自 Throwable 的错误类型的 effect 的实例。

为了方便起见,ZIO 提供了 Task 和 RIO 类型别名,这些别名将错误类型固定为Throwable,对于与 Cats Effect 互操作可能有用:

type Task[   +A] = ZIO[Any, Throwable, A]
type RIO[-R, +A] = ZIO[  R, Throwable, A]

为了对这些类型使用Cats Effect实例,您的 effect 的环境类型的作用域中应具有隐式的 Runtime[R]。以下代码片段为 ZIO 中内置的所有模块创建了一个隐式的Runtime:

implicit val runtime: Runtime[ZEnv] = Runtime.default

如果将 RIO 用于自定义环境 R,则必须创建自己的 Runtime[R],并确保它隐式地出现在需要 Cats Effect 实例的任何地方。

Cats App

为方便起见,您的应用程序可以扩展自 CatsApp,这会自动将隐式 Runtime[Environment] 引入作用域。

Timer

为了获得 cats.effect.Timer[Task] 的实例,我们需要额外导入:

import zio.interop.catz.implicits._

默认的“互操作”不提供“Timer[Task]”的导入的原因是,这使得对需要计时功能的程序的测试变得非常困难。额外的导入(仅在需要的时候)让与计时相关的 effect (的测试)变得更加简单合理。

例子

以下示例显示如何将 ZIO 与 Doobie(用于 JDBC 访问的库)和 FS2(流式库)一起使用,它们都依赖于Cats Effect实例:

import doobie.imports._
import fs2.Stream
import zio.Task
import zio.interop.catz._

val xa: Transactor[Task] = Transactor.fromDriverManager[Task](...)

def loadUsers: Stream[Task, User] =
  sql"""SELECT * FROM users""".query[User].stream.transact(xa)

val allUsers: List[User] = unsafeRun(loadUsers.compile.toList)
Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP