2012-05-11 36 views
7

Teraz czytam Scalę. Oto fragment z książki:Czy projekcje typów typów zależą od ścieżki?

Wszystkie typy zależne od ścieżki są projekcjami typu. Typ zależny od ścieżki foo.Bar został przepisany jako foo.type#Bar przez kompilator ...

W Scala wszystkie odwołania do typów można zapisywać jako projekty względem nazwanych elementów. Typ scala.String jest skrótem nazwy scala.type#String, gdzie nazwa scala odnosi się do pakietu scala, a typ String jest zdefiniowany przez klasę String w pakiecie scala.

Oczywiście, nie ma scala.String klasy, ale nie udało mi się odtworzyć ten z Null.

scala> type N = scala.type#Null 
<console>:7: error: type mismatch; 
found : type 
required: AnyRef 
     type N = scala.type#Null 

Moje pytania są następujące. Czy projekcje typów typów zależą od ścieżki? Czy jest to tylko wewnętrzna reprezentacja kompilatora, czy może być wyrażona w kodzie scala?

Odpowiedz

8

Oto krótka sesja REPL który potwierdza to, co Josh napisał

scala> class Foo { type T = String } 
defined class Foo 

scala> val foo = new Foo 
foo: Foo = [email protected] 

scala> implicitly[foo.type#T =:= foo.T] 
res0: =:=[foo.T,foo.T] = <function1> 

Problem z przykładu scala.type#Null jest to, że przedrostek scala jest prefiksem pakiet zamiast być stabilne identyfikator wartości. Prawdopodobnie powinno być to drugie, ale niestety to nie jest ... to utrzymująca się niedopasowanie między semantyką pakietów Scala i obiektami Scala (w sensie modułów).

+0

Ale według SLS §3.1 'Ścieżka jest jedną z następujących ... p.x gdzie p jest ścieżką, a x jest stabilnym elementem p. Stabilne elementy to pakiety lub ... Stabilny identyfikator to ścieżka kończąca się identyfikatorem. "Scala.Null" jest stabilnym identyfikatorem. Dobrze? – 4e6

+0

Nie, wszystkie stabilne identyfikatory są wartościami lub pakietami: 'scala.Null' oznacza typ, a nie wartość. 'scala' jest stabilnym identyfikatorem, ale jak zauważyłeś, będąc pakietem, a nie obiektem, jego zachowanie w typie singleton tworzącym w operatora' .type' różni się od przykładowego 'foo', które dałem w mojej odpowiedzi. –

+0

Och, teraz wreszcie widzę, że chodzi o zachowanie ".type". Tyle czasu zajęło zrozumienie tego. Dziękuję bardzo :) – 4e6