Przydaje się wraz z klasami wewnętrznymi, które są nawiązywane w nazwach typów. Zobacz na przykład klasy Graph i Node zdefiniowane w A Tour of Scala: Inner Classes. Kwantyfikacja egzystencjalna nad wartością służy do zapisania typu węzłów jakiegoś nieokreślonego wykresu.
type SomeNode = g.Node forSome { val g: Graph }
Może to być przydatne, jeśli chce mieć metodę, która trwała dwa węzły jako argumenty, które miały pochodzić z tego samego wykresu.
def somethingWithTwoNodes[N <: g.Node forSome { val g: Graph }](n1: N, n2: N) = (n1,n2)
Zauważ, że 2.7 nie zaakceptuje tej definicji metody, ponieważ uważa, że jest jakiś rekursji w N.
Następnie, jeśli masz
val g1 = new Graph
val g2 = new Graph
następnie je skompilować
somethingWithTwoNodes(g1.newNode, g1.newNode)
somethingWithTwoNodes(g2.newNode, g2.newNode)
ale te nie są
somethingWithTwoNodes(g1.newNode, g2.newNode)
somethingWithTwoNodes(g2.newNode, g1.newNode)
Jeśli chodzi o cechę Singleton, nie jest ona zdefiniowana w sposób typowy, tzn. Nie ma dla niej pliku klasy. To jest jak typy Any, AnyVal, AnyRef i Null. Jest on zdefiniowany w src/compiler/scala/tools/nsc/symtab/Definitions.scala
wraz z tymi innymi typami, ale wątpię, czy jest to bardzo przydatna informacja. Jest to również dziwna bestia, która jest ostateczną cechą, co oznacza, że nie można jej mieszać podczas definiowania cechy lub klasy, jest to raczej znacznik, który kompilator przypisuje typowi, że jest unikalny z dowolnego innego typu.
Oprócz przypadku Singleton: http://stackoverflow.com/questions/292274/what-is-an-existential-type – Dario