是否可以仅使用没有 TypeTags 的多态函数来重写以下示例?该示例由一个类组成,当应用于具有相同类型参数的实例并且该类型参数具有不同值时,该类具有返回A[T]
的方法。然后被映射到一个两次的 hlist上,生成一个嵌套 hlist 的 hlist,其中包含将每个项目与其他项目匹配的结果:matches
true
A
T
false
matches
l
A[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
每个项目都有一个匹配项,即结果是:
(true :: false :: false :: HNil) ::
(false :: true :: false :: HNil) ::
(false :: false :: true :: HNil) :: HNil
当我尝试在没有 TypeTags 的情况下重写示例时,matches
始终使用它的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 的情况下重写此示例并获得与第一种情况相同的结果?