所以,有以下hlists
几种选择:
val l1 = Option(1) :: Option("str") :: Option(true) :: HNil
val l2 = Option(1) :: {None: Option[String]} :: Option(false) :: HNil
要创建一个包含所有匹配类型对象(它们的 TypeTags)的新列表,可以使用liftA2
函数(https://stackoverflow.com/a/14456938/1092399)(注意:有重复的类型和很多HNil
对象结果,但这不是问题):
object eq extends Poly2 {
implicit def neq[A, B](implicit e: A =:!= B) =
at[Option[A], Option[B]] { case (a, b) => (HNil) }
implicit def eq[A, B](implicit t: TypeTag[A], e: A =:= B) =
at[Option[A], Option[B]] {(a, b) => t :: HNil}
}
liftA2(eq)(l1, l2) //> there would be all three types
所以现在的目标是跳过所有空Option
对象(如果我们能做到这一点,那么就有机会建立一个匹配所有空Option
对象的列表);我们需要这样的东西:
object eqo extends Poly2 {
implicit def neq[A, B](implicit e: A =:!= B) =
at[Option[A], Option[B]] { case (a, b) => (HNil) }
implicit def eq[A, B](implicit t: TypeTag[A], e: A =:= B) =
at[Option[A], Option[B]] {
case(a, None) => HNil
case (None, b) => HNil
case (a, b) => t :: HNil
}
}
liftA2(eqo)(l1, l2) //> result with no String type (should be)
上面的函数是错误的,因为发生了类型擦除(在结果中键入 ~ Product with Serializable with shapeless.HList
)。所以问题是:有没有办法进行这样的检查,或者它完全不真实?
case
ps在这种情况下这是一个非常有趣的类型:Product with Serializable with shapeless.HList