Podemos escrever um existencial explicitamente como este em Scala:
type Exists[P[_]] = P[T] forSome { type T }
Agora vamos apresentar um tipo lambda:
({ type λ[A] = AnotherType[A] })#λ
O tipo lambda declara um módulo embutido com um único membro de tipo, então usamos a projeção de tipo para extrair o tipo parametrizado não aplicado. O tipo é do tipo * -> *, o que significa que podemos passá-lo para Exists
, que espera algo do tipo * -> *.
trait SomeType[A, B]
class HiddenType[A](x: Exists[({ type λ[B] = SomeType[A, B] })#λ])
Eu descobri que essa é uma maneira interessante de ocultar um tipo, ela funciona muito bem se você quiser existenciais do estilo Haskell em seus construtores.