2017-03-14 6 views
3

Ich lerne formlos und verweisend ein Tutorial von here. Welche sagtScala Shapeless - Iterieren/lesen jedes Element von Generic.Repr oder konvertieren es zu HList

Generisches eine einfache Art und Weise ist Fall-Klasse und Produktarten (wie Tupel) zu hList und umgekehrt zu konvertieren:

import shapeless.Generic 

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

val h = gen.to(u) 

Nun, wenn ich h drucken, ich wird Julien :: 30 :: HNil erhalten. Aber ich kann nicht jedes Element von h wie h.head, h.tail wird nicht funktionieren, und es gibt keine Methoden in h. Hier ist h der Typ gen.Repr und ich konnte keinen Weg finden, es in HList entweder zu konvertieren. Also, wie kann ich jedes Element von h lesen?

+0

Der von Ihnen angegebene Code vermittelt wahrscheinlich nicht das Problem, das Sie haben. Weil in diesem Code 'h.head' und' h.tail' gut funktionieren. –

+0

Ich habe versucht intellijide statt repl, die zeigen, "kann Symbol Kopf nicht auflösen", wenn ich h.head. Es hat sich jedoch gut gehalten. Vielleicht ist es das Problem mit Ide. Danke, dass du es aufgezeigt hast. :) –

+0

Oh ja, dann ist es wahrscheinlich nur die IDE, die Probleme mit Implicits und Makros hat. –

Antwort

3

In diesem Fall ist die Art von gen.to(u) ist gen.Repr, die, wenn man sich die Art der gen aussehen aufwendet tatsächlich String :: Int :: HNil, so ist es schon ein HList!

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 

Im allgemeinen Fall, der Repr Typ eines Generic wird entweder ein HList oder ein Coproduct. Beispiele dazu, wie Sie diese generisch programmieren können, finden Sie unter shapeless-type-class-derivation-2015-demo.

Verwandte Themen