我正在尝试使用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
我在这里缺少什么?
谢谢
答案 0 :(得分:24)
导入cats.implicits._
实际上您已导入cats.syntax.AllSyntax
和cats.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.0
和cats-core-1.1.0
导致Symbol 'type cats.kernel.instances.EqInstances' is missing from the classpath.
的依赖关系
必须删除较旧的cats-0.9.0
并使用最新的cats-core
和cats-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
来解决问题,尽管删除全局执行上下文也可以。