缺少 Future 类型的 Cats Functor 实例

25

我正试图使用OptionT将返回Future[Option[T]]的方法组合在一起,以便在for循环中使用。

import cats.data._
import cats.implicits._
import cats.instances.future._

for {
  data <- OptionT(repo.getData(id))
  ... 
}

我遇到的编译器错误是:
could not find implicit value for parameter F cats.Functor[scala.concurrent.Future]

这个最近的例子表明这是(曾经)可能的。
因此,在添加OptionT拉取请求中的文档中也是如此。
还有cats Functor文档
我错过了什么吗?
谢谢
4个回答

38
通过导入 cats.implicits._,实际上已经导入了cats.syntax.AllSyntaxcats.instances.AllInstances。尝试只使用这些导入即可:
import cats.data._
import cats.implicits._

或(根据您的需求):

import cats.data._
import cats.instances.future._

更具体地说:

import cats.data._
import cats.instances.future.catsStdInstancesForFuture

你可能还需要:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

注意:在生产环境中,您当然需要隐式提供实际的ExecutionContext


4
删除导入cats.instances.future._,并添加执行上下文解决了这个问题。感谢,Federico。 - kostja
2
我只使用 import cats.instances.future.catsStdInstancesForFuture,并删除所有其他相关的 cats 导入,也可以解决这个错误。 - Freewind

1

以下导入对我有效(也在批准的答案中提到),

import cats.data.OptionT
import cats.instances.future._ // or import cats.implicits._ 
                               // as implicits include FutureInstances

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

同时,重要的是依赖项,因为我正在使用org.typelevel:cats:0.9.0以及cats-core-1.1.0,这导致了符号'type cats.kernel.instances.EqInstances'在类路径中丢失。

必须删除旧的cats-0.9.0并使用最新的cats-corecats-kernel

libraryDependencies ++= Seq(
  "org.typelevel" %% "cats-core" % "1.1.0",
  "org.typelevel" %% "cats-kernel" % "1.2.0",

  "org.scalatest" %% "scalatest" % "3.0.4" % Test
)

1
似乎造成此问题的原因是多种多样的;我遇到这个问题是因为我在作用域中有两个隐式的ExecutionContext,所以cats无法选择一个来提供Functor[Future]
import scala.concurrent.ExecutionContext.Implicits.global
// ^ first implicit ExecutionContext

class MyClass {
  def myMethod(e: EitherT[Future, _, _])(implicit ec: ExecutionContext) {
    // Second implicit ExecutionContext
    e.flatMap(...) // <- Functor unavailable
  }
}

在我的情况下,我能够通过简单地不将 ec 传递到 myMethod 中来解决问题,尽管删除全局执行上下文也可以起作用。

0

我曾经遇到过同样的问题。实际上 cats 已经被实例化了。

真正的问题只是隐式的 ExecutionContext 丢失了,你可以通过以下方式解决它:

import scala.concurrent.ExecutionContext.Implicits.global

当我尝试为它提供一个实例时,我意识到了这一点。

    implicit val ev: Functor[Future] = new Functor[Future] {
      override def map[A, B](fa: Future[A])(f: A => B): Future[B] = fa.map(f)
    }

此时编译器会报错,提示缺少implicit ExecutionContext


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接