TypeTags を使用せずに多態性関数のみを使用して、次の例を書き直すことは可能ですか? この例は、同じ型パラメーターを持つ のインスタンスに適用され、この型パラメーターが異なる値を持つ場合に戻るA[T]メソッドを持つクラスで構成されています。次に、 の各項目を他の項目と照合した結果を含む入れ子になった hlist の hlist を生成する 2 回の hlistにマップされます。matchestrueATfalsematcheslA[T]l
import scala.reflect.runtime.universe._
import shapeless._
class A[T: TypeTag]{
object matches extends Poly1 {
implicit def default[U: TypeTag] = at[A[U]]{ _ => typeOf[U] <:< typeOf[T] }
}
}
val l = new A[Int] :: new A[String] :: new A[Boolean] :: HNil
object matcher extends Poly1 {
implicit def default[T] = at[A[T]]{ a => l map a.matches }
}
l map matcher
各項目には 1 つの一致があります。つまり、結果は次のようになります。
(true :: false :: false :: HNil) ::
(false :: true :: false :: HNil) ::
(false :: false :: true :: HNil) :: HNil
TypeTagsmatchesを使用せずに例を書き直そうとすると、常にno大文字と小文字が区別され、false が返されます。
import shapeless._
class A[T]{
object matches extends Poly1 {
implicit def yes = at[A[T]]{_ => true}
implicit def no[U] = at[U]{_ => false}
}
}
val l = new A[Int] :: new A[String] :: new A[Boolean] :: HNil
object matcher extends Poly1 {
implicit def default[T] = at[A[T]]{ a => l map a.matches }
}
l map matcher
結果は次のとおりです。
(false :: false :: false :: HNil) ::
(false :: false :: false :: HNil) ::
(false :: false :: false :: HNil) :: HNil
TypeTags なしでこの例を書き直して、最初のケースと同じ結果を得ることは可能ですか?