2012-05-11 3 views
7

Sto leggendo Scala in profondità ora. Ecco un estratto dal libro:I tipi di percorso dipendenti dipendono dalle proiezioni?

Tutti i tipi di percorso dipendono dal tipo di proiezioni. Un tipo dipendente dal percorso foo.Bar viene modificato come foo.type#Bar dal compilatore ...

In Scala, tutti i riferimenti di tipo possono essere scritti come progetti contro entità denominate. Il tipo scala.String è una scorciatoia per scala.type#String dove il nome scala si riferisce al pacchetto scala e il tipo String è definito dalla classe String sul pacchetto scala.

Ovviamente, non v'è scala.String di classe, ma non è riuscito a riprodurre questo con Null.

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

Quindi, le mie domande sono le seguenti. I tipi di percorso dipendenti dipendono dalle proiezioni? È solo la rappresentazione del compilatore interno o può essere espressa in scala di codice?

risposta

8

Ecco una sessione REPL rapido che conferma ciò che ha scritto Josh,

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> 

Il problema con il vostro scala.type#Null esempio è che il prefisso scala è un prefisso pacchetto piuttosto che essere un identificatore stabile di un valore. Probabilmente dovrebbe essere il secondo, ma sfortunatamente non è ... questo è un persistente disallineamento tra la semantica dei pacchetti Scala e gli oggetti Scala (nel senso dei moduli).

+0

Ma secondo SLS §3.1 'Un percorso è uno dei seguenti ... p.x dove p è un percorso e x è un membro stabile di p. I membri stabili sono pacchetti o ... Un identificatore stabile è un percorso che termina in un identificatore. 'Scala.Nullo' è un identificatore stabile. Destra? – 4e6

+0

No, tutti gli identificatori stabili sono valori o pacchetti: 'scala.Null' indica un tipo non un valore. 'scala' è un identificatore stabile ma, come hai osservato, essendo un pacchetto piuttosto che un oggetto, il suo comportamento rispetto al tipo singleton che si forma nell'operatore' .type' è diverso dall'esempio 'foo' che ho dato nella mia risposta. –

+0

Oh, ora, finalmente vedo che si tratta di un comportamento '.type'. Ci è voluto così tanto tempo per capirlo. Grazie mille :) – 4e6