3

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 なしでこの例を書き直して、最初のケースと同じ結果を得ることは可能ですか?

4

1 に答える 1