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)