【问题标题】:Scala Implicit SearchScala 隐式搜索
【发布时间】:2019-10-02 06:55:18
【问题描述】:

在带有猫的 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) 找不到参数实例的隐式值: cat.Functor[scala.concurrent.Future]
Functor[Future].map(Future.successful(2))(_+1)

我通常会修复为:

import cats.instances.future._

但修复没有帮助。而且我不能导入它,因为在隐含的futureFunctor 范围内已经定义了。

我错过了什么?

【问题讨论】:

    标签: scala future implicit scala-cats


    【解决方案1】:

    但是得到一个例外:

    这不是异常,这是编译错误。

    当您编写implicit def futureFunctor(implicit ec: ExecutionContext) = ... 时,这意味着范围内应该有一个ExecutionContext。 但是当你在Functor[Future].map(Future.successful(2))(_+1) 中调用Functor[Future] 时没有。

    试试

    import scala.concurrent.ExecutionContext.Implicits.global
    

    implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
    

    或类似的东西。

    顺便说一句,如果你 import cats.instances.future._ 并定义你的本地 Functor[Future] 似乎会使用猫的那个。

    【讨论】:

    • @DmytroMitin,为什么我只能在定义 futureFunctor 之后导入第一个选项。如果我之前导入它,仍然是编译错误。但是在第二个选项中添加隐式范围,在这两种情况下都有效吗?对于第二个选项,它在哪里定义并不重要。在 futureFunctor 函数之前或之后。
    • @Alexandr 因为如果你在此之前导入 futureFunctor 隐式 ExecutionContext 来自 futureFunctor 的隐式参数和隐式 ExecutionContext 来自导入的 scala.concurrent.ExecutionContext.Implicits.global 会产生歧义。
    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 2020-12-08
    • 2019-07-14
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多