2017-03-17 1 views
2

사용자 지정 다형 클래스의 HList를 매핑하려고합니다. "매개 변수 매퍼에 대한 암시 적 값을 찾을 수 없습니다."오류가 나타납니다. A 코드 샘플 :사용자 정의 유형 바운드가있는 셰이프가없는 매핑 및 하위 형식 다형성

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]에 대한 경계가 예를 들어. 반복 가능 (this very similar question, 해결 방법 및 주석 참조). 내가 뭘 놓치고 있니?

답변

5

어떤 이유로 든 실제 오류는 삼켰습니다. 당신이 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) 
                ^

문제는 L[T] <: C[T]에서 TT <: SubTrait에있는 것과 동일되지 않는 것입니다. 이름을 바꿀 경우는 더 읽기 가져옵니다

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 
+0

소문자로 지역 변수를 쓰는 것이 관례입니다. – OlivierBlanvillain

+0

@OlivierBlanvillain 오, 오케이. 나는 이것이 그것이 대회라는 것을 가정하기에 충분할만큼 일관된 것을 보았다고 말할 수는 없습니다. 그것을 지적 주셔서 감사합니다. –

+0

디버거로 REPL을 사용하여, nice :) 감사합니다! –

관련 문제