Можно ли переписать следующий пример, используя только полиморфные функции без TypeTags? Пример состоит из класса A[T]
, который имеет метод matches
, возвращающий true
при применении к экземпляру A
с параметром того же типа T
и false
, если этот параметр типа имеет другое значение. Затем matches
дважды сопоставляется с h-списком l
из A[T]
, что приводит к h-списку вложенных h-списков, содержащих результаты сопоставления каждого элемента 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 и получить тот же результат, что и в первом случае?