【发布时间】:2016-02-27 05:10:59
【问题描述】:
我有一个特征 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
}
最后一行产生以下错误:
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
^
【问题讨论】: