簡體   English   中英

如何展平 HLists 的 HLists

[英]How to flatten an HLists of HLists

所以在運行時我得到一個 Hlist 的 Hlist,它看起來像:

(2 :: HNil) :: (1001 :: HNil) :: (1001 :: HNil) :: HNil

這里生成的 Hlist 的類型是:

(Int :: HNil) :: (Long :: HNil) :: (Long :: HNil) :: HNil

但這可能是運行時的任何其他類型。 例如,它可能是

(Int :: HNil) :: (String :: HNil) :: HNil


有沒有辦法像這樣展平這個 HList:
 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM