在嵌套类型的伴随对象中查找隐式值

zig*_*tar 5 scala implicit typeclass

我有一个特质Outer与成员F是一个类型构造.我想提供类型类实例F,但不知何故,在某一点上隐式解决方案scalac停止工作.

我尝试构建一个较小的最小示例,但我必须添加下面的所有内容才能显示错误.注意倒数第二行仍在编译,正确地从嵌套的伴随对象中拾取隐含的行sub.

但是最后一行不再编译了.另请注意,在倒数第二行中指定隐式方法时,它会进行编译.

任何人都可以提供为什么会发生这种情况的线索?

trait TC[F[_]]

trait Outer[N[_]] {
  trait F[_]
  object F {
    implicit val tcInst: TC[F] = new TC[F]{}
  }
}

case class Sub[N[_]]() extends Outer[N]

object Test{
  implicit val optionInst: TC[Option] = new TC[Option]{}

  val sub = Sub[Option]()
  val sub2 = Sub[sub.F]()

  implicitly[TC[sub.F]]                  //compiles
  implicitly[TC[sub2.F]](sub2.F.tcInst)  //compiles
  implicitly[TC[sub2.F]]                 //doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

最后一行产生以下错误:

Error:(22, 13) could not find implicit value for parameter e: test.novariance.TC[test.novariance.Test.sub2.F]
  implicitly[TC[sub2.F]]                 //doesn't compile
            ^
Error:(22, 13) not enough arguments for method implicitly: (implicit e: test.novariance.TC[test.novariance.Test.sub2.F])test.novariance.TC[test.novariance.Test.sub2.F].
Unspecified value parameter e.
  implicitly[TC[sub2.F]]                 //doesn't compile
            ^
Run Code Online (Sandbox Code Playgroud)

Ben*_*son 0

我可以明白为什么你的隐式无法解析,所以我将尝试解释为什么它不满足范围规则。

但我不清楚你的意图是什么,所以我无法建议解决方法。

一步步:

  1. 为了满足这个表达式,编译器将搜索词法(周围)范围,然后搜索类型和(即嵌套在其中的对象的类型implicitly[TC[sub2.F]])的同伴(如果有)TCsub2.F.typeFOuter)。
  2. 在词法作用域中只有TC[Option],它与 不是同一类型 sub2.F.type
  3. 在伴生作用域中,TC没有伴生对象。sub2.F不是一个类,它是一个对象,因此它不能有伴生对象。

如果您想引用F其中的特征Outer,则需要类型投影运算符#,例如sub2#F