2017-03-14 4 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

私はh.headをすると、 "シンボルヘッドを解決できません"というreplの代わりにintellij ideで試していました。しかし、それはうまくいった。そのIDEの問題かもしれない。それを指摘してくれてありがとう。 :) –

+0

ああ、それはおそらくちょうどIDEのimplicitsとマクロに問題があります。 –

答えて

3

この場合gen.to(u)の種類は、あなたがgenの種類を見れば、実際にString :: Int :: HNilに消費するgen.Repr、あるので、それはすでに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 

GenericReprタイプHList又はCoproductのいずれかであろう。これらを総称してプログラミングする方法の例については、shapeless-type-class-derivation-2015-demoを参照してください。

関連する問題