2017-03-14 1 views
3

저는 엉터리 배우면서 here에서 튜토리얼을 참조하고 있습니다. 나는Scala Shapeless - Generic.Repr의 각 항목을 반복 또는 읽거나 HList로 변환

import shapeless.Generic 

case class UserWithAge(name: String, age: Int) 
val gen = Generic[UserWithAge] 
val u = UserWithAge("Julien", 30) 

val h = gen.to(u) 

지금은 h를 인쇄하는 경우 : 어느

일반이 경우 클래스와 HList에 제품 유형 (같은 튜플), 그 반대로 변환하는 간단한 방법입니다 말한다 Julien :: 30 :: HNil이됩니다. 그러나 h에서 h.head과 같은 각 요소를 읽을 수 없습니다. h.tail은 작동하지 않으며 h에서 사용할 수있는 방법이 없습니다. 여기에서 hgen.Repr 유형이며 HList으로 변환 할 수있는 방법을 찾지 못했습니다. 그렇다면 h에서 각 요소를 어떻게 읽을 수 있습니까? 이 경우

+0

제공하신 코드는 현재 가지고있는 문제를 전달하지 못할 수도 있습니다. 이 코드에서'h.head'와'h.tail'은 잘 동작하기 때문입니다. –

+0

repl가 아닌 intellij ide를 사용하려고했는데 h.head를 수행하면 "symbol head를 해결할 수 없습니다"라는 메시지가 표시됩니다. 그러나, 그것은 잘 준수했다. ide와 관련된 문제 일 수 있습니다. 그것을 지적 주셔서 감사합니다. :) –

+0

오, 그래, 아마 IDE가 implicits 및 매크로 문제가 있습니다. –

답변

3

gen.to(u)의 유형은 gen의 종류를 보면 그것은 이미 HList 그래서 실제로 String :: Int :: HNil에 소비하는하는 gen.Repr입니다! 일반적인 경우

scala> import shapeless.Generic 
import shapeless.Generic 

scala> case class UserWithAge(name: String, age: Int) 
defined class UserWithAge 

scala> val gen = Generic[UserWithAge] 
gen: shapeless.Generic[UserWithAge]{type Repr = shapeless.::[String,shapeless.::[Int,shapeless.HNil]]} = [email protected] 

scala> val u = UserWithAge("Julien", 30) 
u: UserWithAge = UserWithAge(Julien,30) 

scala> val h = gen.to(u) 
h: gen.Repr = Julien :: 30 :: HNil 

scala> h.head 
res0: String = Julien 

scala> h.tail 
res1: shapeless.::[Int,shapeless.HNil] = 30 :: HNil 

하는 Generic Repr의 유형 중 하나 또는 HList Coproduct 것이다. 이들에 대해 일반적으로 프로그래밍하는 방법의 예는 shapeless-type-class-derivation-2015-demo을 참조하십시오.

관련 문제