Unfortunately, I do not consider it possible to construct the required proof of inequality until Out is defined. The closest I can get to what you want is something like this,
scala> import shapeless._ // for =:!= import shapeless._ scala> import scala.concurrent.Future import scala.concurrent.Future scala> trait NotFuture { | type Out[+T] | val ev: Out[_] =:!= Future[_] | def prf(implicit ev: Out[_] =:!= Future[_]) = ev | } defined trait NotFuture scala> val nf = new NotFuture { type Out[+T] = List[T] ; val ev = prf } nf: NotFuture{type Out[+T] = List[T]} = $anon$1@5723cc36 scala> val nf = new NotFuture { type Out[+T] = Future[T] ; val ev = prf } <console>:12: error: ambiguous implicit values: both method neqAmbig1 in package shapeless of type [A]=> shapeless.=:!=[A,A] and method neqAmbig2 in package shapeless of type [A]=> shapeless.=:!=[A,A] match expected type shapeless.=:!=[this.Out[_],scala.concurrent.Future[_]] val nf = new NotFuture { type Out[+T] = Future[T] ; val ev = prf }
Note that providing evidence is mandatory (since ev is abstract in NotFuture ) and is provided semi-implicitly in subclasses ( val ev = prf ).
source share