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