2017-03-14 1 views
3

J'apprends sans forme et référence un tutoriel de . Ce qui dit,Scala Shapeless - Itérer/lire chaque élément de Generic.Repr ou le convertir en HList

Générique est un moyen simple de convertir la classe de cas et les types de produits (comme tuples) à HList, et vice-versa:

import shapeless.Generic 

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

val h = gen.to(u) 

Maintenant, si j'imprimer h, je obtiendra Julien :: 30 :: HNil. Mais, je suis incapable de lire chaque élément de h tels que h.head, h.tail ne fonctionnera pas et il n'y a pas de méthodes disponibles dans h. Ici, h est le type de gen.Repr et je ne pouvais pas trouver un moyen de le convertir en HList non plus. Alors, comment puis-je lire chaque élément de h?

+0

Le code que vous avez fourni ne traduit probablement pas le problème que vous rencontrez. Parce que dans ce code 'h.head' et' h.tail' fonctionnent très bien. –

+0

J'essayais dans intellij ide au lieu de repl, qui montrent "ne peut pas résoudre la tête de symbole" si je fais h.head. Cependant, il s'est bien acquitté. Peut être son le problème avec ide. Merci de l'avoir signalé. :) –

+0

Oh oui, alors c'est probablement juste l'IDE qui a des problèmes avec les implicits et les macros. –

Répondre

3

Dans ce cas, le type de gen.to(u) est gen.Repr, qui, si vous regardez le type de gen réellement String :: Int :: HNil dépense, il est donc déjà un 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 

Dans le cas général, le type Repr d'un Generic sera soit un HList ou Coproduct. Pour des exemples de programmation générique sur ces derniers, voir shapeless-type-class-derivation-2015-demo.