在猫的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。
我错过了什么?
但有一个例外:
这不是一个例外,这是一个编译错误。
当你编写隐式 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的仿函数。