【问题标题】:missing Cats Functor[Future] instance缺少 Cats Functor[Future] 实例
【发布时间】:2017-09-09 08:28:52
【问题描述】:

我正在尝试使用OptionT 来组合返回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

我在这里错过了什么?

谢谢

【问题讨论】:

    标签: scala future monad-transformers scala-cats


    【解决方案1】:

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

    【讨论】:

    • 删除 import cats.instances.future._ 并添加 ExecutionContext 解决了这个问题。谢谢你,费德里科。
    • 我只使用import cats.instances.future.catsStdInstancesForFuture,并删除所有其他相关的猫导入,也可以修复此错误
    【解决方案2】:

    以下导入对我有用(在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
    )
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        遇到了同样的问题。 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-15
          • 1970-01-01
          • 2020-02-24
          • 2019-09-23
          相关资源
          最近更新 更多