1

所以,有以下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)。所以问题是:有没有办法进行这样的检查,或者它完全不真实?

caseps在这种情况下这是一个非常有趣的类型:Product with Serializable with shapeless.HList

4

0 回答 0