缺少Cats Functor [Future]实例

时间:2017-04-13 09:29:12

标签: scala future monad-transformers scala-cats

我正在尝试使用OptionT来组合在for-comprehension中返回Future[Option[T]]的方法。

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]

recent example表明这是(可能?)。

pull request for adding OptionT

中的文档也是如此

cats Functor docs

我在这里缺少什么?

谢谢

4 个答案:

答案 0 :(得分:24)

导入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

答案 1 :(得分:0)

以下导入对我有用(在approved answer中也提到过)

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.0cats-core-1.1.0导致Symbol 'type cats.kernel.instances.EqInstances' is missing from the classpath.的依赖关系

必须删除较旧的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
)

答案 2 :(得分: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

答案 3 :(得分:0)

这个问题的原因似乎是多种多样的;我刚刚遇到这个是因为我有两个隐式 ExecutionContext 可用,所以猫无法选择一个来提供 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 来解决问题,尽管删除全局执行上下文也可以。