Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 自定义类型绑定的无形状映射和子类型多态性_Scala_Polymorphism_Shapeless - Fatal编程技术网

Scala 自定义类型绑定的无形状映射和子类型多态性

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 <:

尝试映射自定义多态类的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 <: 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