2010-02-03 9 views
9

Natknąłem się na egzystencjalną kwantyfikację wartości w języku Scala Specyfikacja (3.2.10 Egzystencjalne typy).Egistential Quantification over Values ​​

x: y.Inner forSome{val y : Outer} 

Czy ktoś ma do tego przykładowe przypadki użycia?

T forSome {val x: S} jest zdefiniowany jako T forSome { type t <: S with Singleton }. Cecha Singletron jest wymieniona w Specyfikacji (3.2.1 Singleton Types), ale nie mogłem jej znaleźć w Scaladoc. Gdzie to jest zdefiniowane?

+0

Oprócz przypadku Singleton: http://stackoverflow.com/questions/292274/what-is-an-existential-type – Dario

Odpowiedz

12

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.

+0

Dzięki. Wszelkie pomysły, w których Singleton jest zdefiniowany? –

+0

Czy nie nazywa się "Typy zależne od trasy"? – pedrofurla

0

Pierwsza połowa this paper używa tej techniki do budowania typu strumienia.

+0

Pobieranie nie działa. Czy masz inne źródło? –