The problem is that Poly1.Caseit is not covariant in its type parameter. Consider the following:
trait Foo
trait Bar extends Foo
val foo = new Foo {}
var bar = new Bar {}
object fooIdentity extends Poly1 {
implicit def caseFoo = at[Foo](identity)
}
fooIdentity(foo) , fooIdentity(bar) .
HList _5 _3. Nat, NatToString , - Nat.
, :
object NatToString extends Poly1 {
implicit def caseNat[N <: Nat] = at[N](_.toString)
}
, Nat , - .