したがって、次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