Scala: не удается найти неявное значение для ContextShift [cats.effect.IO] - PullRequest
2 голосов
/ 14 февраля 2020

Я только что начал с scala и хочу создать соединение с моей БД.

(Мои знания основаны на руководстве по scala / doob ie по https://www.scala-exercises.org/)

Теперь вот код:

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

Когда я пытаюсь создать свой код, я получаю следующее сообщение об ошибке:

Ошибка: (25, 53 ) Не удается найти неявное значение для ContextShift [cats.effect.IO]:

  • импортировать ContextShift [cats.effect.IO] из библиотеки эффектов

  • если используется IO, используйте cats.effect.IOApp или создайте его с помощью cats.effect.IO.contextShift xa <- HikariTransactor.newHikariTransactor [IO] (</p>

сейчас У меня два вопроса:

  1. В чем именно проблема?
  2. Как мне ее исправить?

1 Ответ

1 голос
/ 14 февраля 2020

Проблема в том, что компилятор не может найти экземпляр ContextShift[IO] в неявной области видимости, который требуется для некоторых методов (не уверен, какой именно). Вам необходимо объявить свой собственный в неявной области видимости, например

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

или в качестве сообщения об ошибке 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 глобальный контекст выполнения по умолчанию.

Надеюсь, это поможет!

...