Scala - Mixin type constraints are still compiling

After Use Type Difference

I noticed that this is a compilation and do not know why.

trait NotFuture { type Out[+T] implicitly[Out[_] =!= scala.concurrent.Future[_]] } val newNotFuture = new NotFuture { type Out[+T] = scala.concurrent.Future[T] } 

Any idea how to make this work?

+2
source share
1 answer

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 ).

+3
source

All Articles