Scala 隐式搜索

Scala Implicit Search

Scala 中的猫:

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

Whenever we summon a Functor for Future , either directly using Functor.apply or indirectly via the map extension method, the compiler will locate futureFunctor by implicit resolu on and recursively search for an ExecutionContext at the call site. This is what the expansion might look like:

// 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)

但是得到一个例外:

Error:(29, 10) could not find implicit value for parameter instance: cats.Functor[scala.concurrent.Future]
Functor[Future].map(Future.successful(2))(_+1)

我通常会修复为:

import cats.instances.future._

但是修复没有帮助。而且我不能导入它,因为在隐含的范围内 futureFunctor 已经定义。

我错过了什么?

But get an exception:

这不是异常,这是编译错误。

当你写 implicit def futureFunctor(implicit ec: ExecutionContext) = ... 时,这意味着范围内应该有一个 ExecutionContext。 但是当你在 Functor[Future].map(Future.successful(2))(_+1) 中调用 Functor[Future] 时没有。

尝试

import scala.concurrent.ExecutionContext.Implicits.global

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

或类似的东西。

顺便说一下,如果您 import cats.instances.future._ 并定义本地 Functor[Future] 似乎会使用猫的。