2013-04-03 10 views
12

Perché questo codice non riesce a compilare con l'errore: non trovato: valore Matrix? Dalla documentazione e alcuni esempi di codice (probabilmente non aggiornati) dovrebbe funzionare?Principiante: alias di tipo Scala in Scala 2.10?

object TestMatrix extends App{ 
type Row = List[Int] 
type Matrix = List[Row] 


val m = Matrix(Row(1,2,3), 
       Row(1,2,3), 
       Row(1,2,3) 
      ) 


} 

risposta

46

Matrix indica un tipo, ma lo si utilizza come un valore.

Quando si esegue List(1, 2, 3), si sta effettivamente chiamando List.apply, che è un metodo di fabbrica per List.

Per risolvere il tuo errore di compilazione, è possibile definire le proprie fabbriche per Matrix e :

object TestMatrix extends App{ 
    type Row = List[Int] 
    def Row(xs: Int*) = List(xs: _*) 

    type Matrix = List[Row] 
    def Matrix(xs: Row*) = List(xs: _*) 

    val m = Matrix(Row(1,2,3), 
     Row(1,2,3), 
     Row(1,2,3) 
    ) 
} 
+0

Questo è brillante, grazie. Questo è anche chiarito che cosa si applica pure. – Tony

+2

Solo una piccola nota che se specifichi esplicitamente il tipo di ritorno per le funzioni di fabbrica (es. 'Def Matrix (xs: Row *): Matrix = List (xs: _ *)') tu (forse ovviamente) aiuterai il compilatore/type checker vede il risultato come un 'Matrix' invece di un' List [Row] '. La definizione di 'Matrix' come un oggetto con un metodo' apply' identico al metodo factory 'Matrix' mostrato funziona, naturalmente. – ches

5

Da this articolo che avete.

Note also that along with most of the type aliases in package scala comes a value alias of the same name. For instance, there's a type alias for the List class and a value alias for the List object.

Una soluzione al problema si traduce in:

object TestMatrix extends App{ 
    type Row = List[Int] 
    val Row = List 
    type Matrix = List[Row] 
    val Matrix = List 

    val m = Matrix(Row(1,2,3), 
        Row(1,2,3), 
        Row(1,2,3)) 
} 
+12

Sebbene questa sia la soluzione comune al problema, non è appropriata in questo caso perché l'alias di tipo corregge i parametri di tipo (a 'Int' e' Row'). Per esempio il tuo codice ti permette di fare 'Matrix (" aze ", 123)' (restituendo un 'List [Any]', che chiaramente è ** non ** lo stesso tipo di 'Matrix'), che non è certamente il previsto comportamento. –