2017-02-04 1 views
3

H27 L에 특정 유형 인 A이 포함되도록 typecass를 정의하려고합니다.HCL에 포함 된 Typeclass 요소?

trait Contains[A] { 
    type Out 
} 
object Contains { 

    type Aux[A, O] = Contains[A] { type Out = O } 

    def contains[L <: HList, A] 
     (implicit ev: Contains.Aux[L, A]) = ev 

    implicit def containsInt[H, L <: HList, A] 
     (implicit ev: H == A): Contains.Aux[H :: L, A] = 
    new Contains[H :: L] { 
     type Out = A 
    } 
} 

물론 ev: H == A으로 인해 컴파일되지 않습니다.

이러한 "등가 유형"typeclass가 있습니까?

가 작동되면, 나는 기대할 컴파일하려면 다음

implicitly[Contains.Aux[Int :: HNil, Int]]을 HList에 Int을 거기에 있기 때문이다.

반면에 입력 된 HList에 Boolean이 없기 때문에 implicitly[Contains.Aux[String :: HNil, Boolean]이 컴파일되지 않을 것으로 예상됩니다.

+0

나는 당신이 증거의 유형을 변경할 수 있다고 생각 H는 =이 유형을 얻기 어렵다 일반적으로 을 = https://github.com/underscoreio/shapeless-guide/blob/develop/dist/shapeless-guide.pdf –

+0

를 작동하는 제약 나는 볼품 좋은이 참조를 발견했다. 나는 그것을 다시 읽을 필요가있다! –

+0

제가 구입하고 우수한 책의 대부분을 읽어 –

답변

2

당신은 shapeless.ops.hlist.Selector을 찾고 있습니다. 암시 EV : 당신의 예는 다음과 같이 해결 Selector

,

scala> import shapeless._, ops.hlist._ 
import shapeless._ 
import ops.hlist._ 

scala> Selector[Char :: HNil, Char] 
res0: shapeless.ops.hlist.Selector[shapeless.::[Char,shapeless.HNil],Char] = [email protected] 

scala> Selector[Int :: Char :: HNil, Char] 
res1: shapeless.ops.hlist.Selector[shapeless.::[Int,shapeless.::[Char,shapeless.HNil]],Char] = [email protected] 

scala> Selector[Int :: HNil, Int] 
res2: shapeless.ops.hlist.Selector[shapeless.::[Int,shapeless.HNil],Int] = [email protected] 

scala> Selector[Boolean :: Char :: HNil, Int] 
<console>:18: error: Implicit not found: shapeless.Ops.Selector[shapeless.::[Boolean,shapeless.::[Char,shapeless.HNil]], Int]. You requested an element of type Int, but there is none in the HList shapeless.::[Boolean,shapeless.::[Char,shapeless.HNil]]. 
     Selector[Boolean :: Char :: HNil, Int] 
      ^

scala> Selector[Boolean :: Char :: HNil, Char] 
res4: shapeless.ops.hlist.Selector[shapeless.::[Boolean,shapeless.::[Char,shapeless.HNil]],Char] = [email protected] 

scala> Selector[Boolean :: Int :: Char :: HNil, Char] 
res5: shapeless.ops.hlist.Selector[shapeless.::[Boolean,shapeless.::[Int,shapeless.::[Char,shapeless.HNil]]],Char] = [email protected] 

scala> Selector[Int :: HNil, HNil] 
<console>:18: error: Implicit not found: shapeless.Ops.Selector[shapeless.::[Int,shapeless.HNil], shapeless.HNil]. You requested an element of type shapeless.HNil, but there is none in the HList shapeless.::[Int,shapeless.HNil]. 
     Selector[Int :: HNil, HNil] 
      ^