【发布时间】:2019-06-23 06:04:07
【问题描述】:
我在 Scala 中使用 Shapeless 的 Generic.Aux 时遇到了以下隐式问题:
case class Complex(re: Double, im: Double)
object Prod2 {
def unapply[C, A, B](c: C)(implicit C: Generic.Aux[C, A :: B :: HNil]) = Some((C.to(c).head, C.to(c).tail.head))
}
val c = Complex(1.0, 2.0)
val Prod2(re, im) = c
上面的代码无法编译。它报告
Error:(22, 7) could not find implicit value for parameter C: shapeless.Generic.Aux[nexus.ops.Test.Complex,A :: B :: shapeless.HNil]
val Prod2(re, im) = c
Error:(22, 7) not enough arguments for method unapply: (implicit C: shapeless.Generic.Aux[nexus.ops.Test.Complex,A :: B :: shapeless.HNil])Some[(A, B)].
Unspecified value parameter C.
val Prod2(re, im) = c
但是,如果我手动这样做
implicitly[Generic.Aux[Complex, Double :: Double :: HNil]]
派生这个隐式实例是完全可以的。
【问题讨论】:
-
我不会看这段代码,其范围内有两个名为
C的符号。这是故意的吗? -
类型类实例不是与 Scala 规范的类型同名吗?例如
K: Eq[K] -
也许我对此一无所知。我知道 Scala 有关于阴影和隐含的错误,我应该在该领域提供修复,我可能仍然会解决它。
-
@som-snytt 有时使用相同的字母是标准的:github.com/typelevel/cats/blob/master/core/src/main/scala/cats/…github.com/typelevel/cats/blob/master/core/src/main/scala/cats/… 这取决于代码约定。