Scala 自定义类型绑定的无形状映射和子类型多态性
尝试映射自定义多态类的HList时,我遇到了可怕的“找不到参数映射器的隐式值”错误。代码示例:Scala 自定义类型绑定的无形状映射和子类型多态性,scala,polymorphism,shapeless,Scala,Polymorphism,Shapeless,尝试映射自定义多态类的HList时,我遇到了可怕的“找不到参数映射器的隐式值”错误。代码示例: import shapeless._ trait SubTrait case class A() extends SubTrait case class B() extends SubTrait case class C[T <: SubTrait](x: T) object TheMapper extends Poly1 { implicit def default[T <:
import shapeless._
trait SubTrait
case class A() extends SubTrait
case class B() extends SubTrait
case class C[T <: SubTrait](x: T)
object TheMapper extends Poly1 {
implicit def default[T <: SubTrait, L[T] <: C[T]] = at[L[T]](_.x)
}
val ab = C(A()) :: C(B()) :: HNil
println(ab.map(TheMapper))
导入无形状_
性状潜线
case类A()扩展了SubTrait
case类B()扩展了SubTrait
案例C类[T由于某种原因,实际错误被吞没。如果您在REPL中一步一步地编译此错误,您将得到以下错误:
error: type arguments [T] do not conform to class C's type parameter bounds [T <: SubTrait]
implicit def default[T <: SubTrait, L[T] <: C[T]] = at[L[T]](_.x)
^
解决方案是在x
上加一个边界
scala> object TheMapper extends Poly1 {
| implicit def default[T <: SubTrait, L[x <: SubTrait] <: C[x]] = at[L[T]](_.x)
| }
defined object TheMapper
scala> val ab = C(A()) :: C(B()) :: HNil
ab: shapeless.::[C[A],shapeless.::[C[B],shapeless.HNil]] = C(A()) :: C(B()) :: HNil
scala> println(ab.map(TheMapper))
A() :: B() :: HNil
scala>对象映射扩展Poly1{
|implicit def def default[T注意约定是写局部类型变量小写。@OlivierBlanvillain哦,好的。我不能说我已经看到这样做的一致性足以假设这是约定。感谢您指出。使用REPL作为调试器,尼斯:)谢谢!
scala> object TheMapper extends Poly1 {
| implicit def default[T <: SubTrait, L[x <: SubTrait] <: C[x]] = at[L[T]](_.x)
| }
defined object TheMapper
scala> val ab = C(A()) :: C(B()) :: HNil
ab: shapeless.::[C[A],shapeless.::[C[B],shapeless.HNil]] = C(A()) :: C(B()) :: HNil
scala> println(ab.map(TheMapper))
A() :: B() :: HNil