カスタムポリモーフィッククラスの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))
これは、L [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)
^
問題は、T
inL[T] <: C[T]
がT <: SubTrait
。のinと同じではないことです。名前を変更すると、読みやすくなります。
scala> object TheMapper extends Poly1 {
| implicit def default[T <: SubTrait, L[x] <: C[x]] = at[L[T]](_.x)
| }
<console>:18: error: type arguments [x] do not conform to class C's type parameter bounds [T <: SubTrait]
implicit def default[T <: SubTrait, L[x] <: C[x]] = 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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加