[英]How to flatten an HLists of HLists
所以在運行時我得到一個 Hlist 的 Hlist,它看起來像:
(2 :: HNil) :: (1001 :: HNil) :: (1001 :: HNil) :: HNil
(Int :: HNil) :: (Long :: HNil) :: (Long :: HNil) :: HNil
但這可能是運行時的任何其他類型。 例如,它可能是
(Int :: HNil) :: (String :: HNil) :: HNil
2 :: 1001 :: 1001 :: HNil
具有以下類型:
Int :: Long :: Long :: HNil
您可以將功能操作應用於 HList。 看看 Poly 是如何工作的。 首先,我們為(Int::HNil) 和 (Long::HNil)聲明 Poly:
import shapeless._
object myPoly extends Poly1 {
implicit val tupleIntCase: Case.Aux[(Int :: HNil), Int] =
at(position => position.head)
implicit val tupleLongCase: Case.Aux[(Long :: HNil), Long] =
at(position => position.head)
}
並使用 map 函數,您可以提取和展平 HList:
((2 :: HNil) :: (1001L :: HNil) :: (1001 :: HNil) :: HNil).map(myPoly)
它給出了預期的結果:
2 :: 1001 :: 1001 :: HNil
請注意,此處生成的類型是:
Int :: Long :: Int :: HNil
為了簡潔起見,您可以使用 shapeless 定義的身份 Poly:
import shapeless._
import shapeless.poly.identity
val nestedHList = (2 :: HNil) :: (1001 :: HNil) :: (1001 :: HNil) :: HNil
nestedHList.flatMap(identity)
// 2 :: 1001 :: 1001 :: HNil
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.