I’ve been trying to dive into Play’s functional internals and I’ve stumbled upon join
method in FunctionalBuilder
:
def join[A >: A1](implicit witness1: <:<[A, A1], witness2: <:<[A, A2], fu: ContravariantFunctor[M]): M[A] =
apply[A]((a: A) => (a: A1, a: A2))(fu)
My question is - why we specify that A >: A1
while we expect to implicitly get witness1
that effectively specifies A <: A1
. Why not to have A =:= A1
witness then?