Scala:找不到 ContextShift[cats.effect.IO] 的隐式值

Ego*_*rin 5 scala scala-cats cats-effect

我刚刚开始使用 scala,想要建立到我的数据库的连接。

(我的知识来源于https://www.scala-exercises.org/上的 scala/doobie 教程)

现在这是代码:

import doobie._
import doobie.implicits._
import cats.effect._
import cats.implicits._
import doobie.hikari._

...
val transactor: Resource[IO, HikariTransactor[IO]] =
    for {
      ce <- ExecutionContexts.fixedThreadPool[IO](32)         // our connect EC
      be <- Blocker[IO]                                       // our blocking EC
      xa <- HikariTransactor.newHikariTransactor[IO](
        "org.h2.Driver",                                      // driver classname
        "jdbc:mysql://localhost:3306/libraries",              // connect URL
        "root",                                               // username
        "",                                                   // password
        ce,                                                   // await connection here
        be                                                    // execute JDBC operations here
      )
    } yield xa
Run Code Online (Sandbox Code Playgroud)

当我尝试构建我的代码时,我收到以下错误消息:

错误:(25, 53) 无法找到 ContextShift[cats.effect.IO] 的隐式值:

  • 从效果库导入 ContextShift[cats.effect.IO]

  • 如果使用 IO,请使用 cats.effect.IOApp 或使用 cats.effect.IO.contextShift xa <- HikariTransactor.newHikariTransactor[IO]( 构建一个

现在我有两个问题:

  1. 到底是什么问题呢?
  2. 我如何解决它?

Iva*_*nko 5

编译器无法在隐式作用域中找到实例的问题ContextShift[IO],这是某些方法所必需的(不确定到底是哪一个)。您需要在隐式范围内声明自己的范围,例如

val dbExecutionContext = ExecutionContext.global // replace with your DB specific EC.
implicit val contextShift: ContextShift[IO] = IO.contextShift(dbExecutionContext)
Run Code Online (Sandbox Code Playgroud)

或者作为错误建议消息cats.effect.IOApp声明ContextShift[IO]protected implicit def- 请参阅https://github.com/typelevel/cats-effect/blob/master/core/shared/src/main/scala/cats/effect/IOApp.scala#L83您可以在此代码所在的位置使用并传递引用。但要小心,因为它使用 Scala 默认的全局执行上下文。

希望这可以帮助!