【发布时间】:2013-11-19 02:14:14
【问题描述】:
是否可以仅使用不带 TypeTags 的多态函数重写以下示例?该示例由一个类A[T] 组成,该类具有一个方法matches,当应用于A 的实例时返回true,该实例具有相同的类型参数T 和false,如果此类型参数具有不同的值。然后将matches 映射到A[T] 的hlist l 上两次,从而生成嵌套hlist 的hlist,其中包含将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 的情况下重写此示例并获得与第一种情况相同的结果?
【问题讨论】: