如何扁平化HLists的HLists



所以在运行时,我得到一个Hlists的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进行函数式操作。看看保利是如何工作的。首先,我们为(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定义的标识多边形:

import shapeless._
import shapeless.poly.identity
val nestedHList = (2 :: HNil) :: (1001 :: HNil) :: (1001 :: HNil) :: HNil
nestedHList.flatMap(identity)
// 2 :: 1001 :: 1001 :: HNil

最新更新