当前位置: 首页 > 知识库问答 >
问题:

Scala Implicit Search

康赞
2023-03-14

在猫的Scala中:

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

每当我们为Future调用Functor时,无论是直接使用Functor.apply还是通过map扩展方法间接调用,编译器都会通过隐式解析定位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.success(2))(_ 1)

我通常会将其修复为:

import cats.instances.future._

但是这种解决方法并没有帮助。我不能导入它,因为在作用域中已经定义了隐式的< code>futureFunctor。

我错过了什么?

共有1个答案

司寇昱
2023-03-14

但有一个例外:

这不是一个例外,这是一个编译错误。

当你编写隐式 def futureFunctor(implicit ec: ExecutionContext) = ... 这意味着在作用域中应该有一个 ExecuteContext。但是当你在 Functor[Future].map(Future.success(2))(_ 1) 中调用 Functor[Future] 时,并没有。

尝试

import scala.concurrent.ExecutionContext.Implicits.global

或者

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

或者类似的东西。

顺便说一下,如果您< code > import cats . instances . Future . _ 并定义您的本地< code >仿函数[Future],似乎将使用cat的仿函数。

 类似资料:

相关问答

相关文章

相关阅读