Scala Implicit Search - PullRequest
       48

Scala Implicit Search

1 голос
/ 15 мая 2019

В Scala with Cats:

import scala.concurrent.{Future, ExecutionContext}
implicit def futureFunctor
  (implicit ec: ExecutionContext): Functor[Future] = …

Всякий раз, когда мы вызываем Functor for Future, либо напрямую, используя Functor.apply, либо косвенно через метод расширения карты, компилятор найдет futureFunctor неявным образомРазрешите и рекурсивно ищите ExecutionContext на сайте вызова.Вот как может выглядеть расширение:

// We write this:
Functor[Future]
// The compiler expands to this first:
Functor[Future](futureFunctor)
// And then to this:
Functor[Future](futureFunctor(executionContext))

Хорошо, я пробую это:

  import scala.concurrent.{Future, ExecutionContext}
  implicit def futureFunctor
  (implicit ec: ExecutionContext): Functor[Future] = new Functor[Future] {
    override def map[A, B](fa: Future[A])(f: A => B): Future[B] =fa map f
  }

  Functor[Future].map(Future.successful(2))(_+1)

Но получите исключение:

Ошибка: (29, 10) не удалось найти неявное значение для экземпляра параметра: cats.Functor [scala.concurrent.Future]
Functor [Future] .map (Future.successful (2)) (_ + 1)

Что я обычно исправляю как:

import cats.instances.future._

Но исправление не помогает.И я не должен импортировать его, потому что в области неявных futureFunctor уже определены.

Что мне не хватает?

1 Ответ

6 голосов
/ 15 мая 2019

Но получите исключение:

Это не исключение, это ошибка компиляции.

Когда вы пишете implicit def futureFunctor(implicit ec: ExecutionContext) = ..., это означает, что должно бытьExecutionContext по объему.Но не было, когда вы звонили Functor[Future] в Functor[Future].map(Future.successful(2))(_+1).

Попробуйте

import scala.concurrent.ExecutionContext.Implicits.global

или

implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))

или что-то подобное.

Кстати, если вы import cats.instances.future._ и определите свой местный Functor[Future], то, кажется, будет использоваться кошачий.

...