Карта в HList не работает с подтипами универсального типа в Scala & Shapeless

Скажем, у нас есть следующие классы и некоторые значения (в Scala):

class A[T](val x: T)
class B[T](x: T, val y: T) extends A[T](x)

val x1 = new A("test")
val x2 = new B(1,2)
val x3 = new B("foo","bar")
val x4 = new A(1)

Далее мы определяем следующее значение полиморфной функции (используя бесформенное):

object f extends (A ~> Option) {
  def apply[T](s: A[T]) = Some(s.x)
}

Теперь мы можем позвонить:

f(x1); f(x2); f(x3); f(x4)

Что у всех получится (и должно ИМХО). Тем не мение:

val list = x1 :: x2 :: x3 :: x4 :: HNil
list.map(f)

// could not find implicit value for parameter mapper:
// shapeless.Mapper[f.type,shapeless.::[A[String],shapeless.::[
//   B[Int],shapeless.::[B[String],shapeless.::[A[Int],shapeless.HNil]]]]]

Где я ожидал:

Some("test") :: Some(1) :: Some("foo") :: Some(1) :: HNil

Обратите внимание, что это работает:

val list2 = x1 :: x4 :: HNil // only instances of A
list2.map(f)

ОБНОВИТЬ

Кажется, что если мы укажем каждый случай отдельно,хорошо

object f extends Poly1 {
  implicit def caseA[T] = at[A[T]]{s => Some(s.x)}
  implicit def caseB[T] = at[B[T]]{s => Some(s.x)}
}

Тем не менее, попытка выразить это немного умнее, не работает (даже для простых приложений):

object f extends Poly1 {
  implicit def caseA[T, S  Some(s.x)}
}

Ответы на вопрос(1)

Ваш ответ на вопрос