Правильным является
trait StaticRoles { this: (Databases[F] forSome { type F[_] }) => }
Есть ли сокращение для переменной типа 'm forSome {type m [O] <: UpperBound [O]} `in Scala? </a>
Не каждый экзистенциальный тип может быть выражен подчеркиванием или (в данном случае) может быть выражен подчеркиванием.
Существует также
trait StaticRoles { this: Databases[F forSome { type F[_] }] => }
, отличный от первого, но то же самое, что и
trait StaticRoles { this: Databases[Any] => }
, поскольку
implicitly[(Databases[F forSome { type F[_] }]) =:= Databases[Any]]
(Any
на самом деле является полинородным).
Databases[Any]
является подтипом Databases[F] forSome { type F[_] }
implicitly[Databases[Any] <:< (Databases[F] forSome { type F[_] })]
С проекциями типа (#
) правильное значение равно
trait StaticRoles { this: Databases[({ type F[_] })#F] => }
Databases[({ type F[_] })#F]
также является подтипом Databases[F] forSome { type F[_] }
(несопоставимо с Databases[Any]
для инварианта Databases
) .
Среди этих трех типов Databases[F] forSome { type F[_] }
, Databases[Any]
и Databases[({ type F[_] })#F]
только первый работает с
trait IO[_]
class Abc extends Databases[IO] with StaticRoles // compiles
//class Abc1 extends StaticRoles // doesn't compile