2017-03-14 24 views
3

我在學習沒有形狀並參考here的教程。它說,Scala無形 - 迭代/讀取Generic.Repr的每個項目或將其轉換爲HList

一般是轉換案例類和產品類型(如 元組)到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,我將獲得Julien :: 30 :: HNil。但是,我無法讀取h中的每個元素,如h.head,h.tail將不起作用,並且h中沒有任何可用的方法。在這裏,hgen.Repr的類型,我無法想出將其轉換爲HList的方法。那麼,我如何從h讀取每個元素?

+0

您提供的代碼可能無法傳達您遇到的問題。因爲在這個代碼中'h.head'和'h.tail'工作得很好。 –

+0

我試圖在intellij ide而不是repl,它顯示「無法解析符號頭」,如果我做h.head。但是,它很好。可能是它與IDE的問題。感謝您指出。 :) –

+0

哦,是的,那麼它可能只是IDE有implicits和宏的問題。 –

回答

3

在這種情況下gen.to(u)類型爲gen.Repr,而如果你看看gen類型實際消費來String :: Int :: HNil,所以它已經是一個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 

在一般情況下,Repr類型Generic的將或者一個HListCoproduct。有關如何統一編程這些參數的示例,請參閱shapeless-type-class-derivation-2015-demo

相關問題