2013-04-03 21 views
12

Dlaczego ten kod nie kompiluje się z błędem: nie znaleziono: wartość Macierz? Z dokumentacji i niektórych (prawdopodobnie nieaktualnych) przykładów kodu powinno to zadziałać?Początkujący: alias typu Scala w Scali 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) 
      ) 


} 

Odpowiedz

46

Matrix oznacza typ, ale używasz go jako wartości.

Kiedy robisz List(1, 2, 3), to w rzeczywistości dzwonisz pod numer List.apply, który jest fabryczną metodą dla List.

naprawić swój błąd kompilacji, można zdefiniować własne fabryki na Matrix i :

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

To genialny, dzięki. To również wyjaśniło, co dotyczy również. – Tony

+2

Tylko mała uwaga, że ​​jeśli jawnie określisz typ zwracania dla funkcji fabrycznych (tj. 'Def Matrix (xs: Row *): Matrix = List (xs: _ *)') będziesz (prawdopodobnie) pomóc kompilatorowi/sprawdzanie typu zobacz wynik jako 'Matrix' zamiast' List [Row] '. Zdefiniowanie "Matrixa" jako obiektu za pomocą metody "apply", która jest identyczna z przedstawioną metodą "Matrix", również działa. – ches

5

Od this artykuł masz.

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.

Rozwiązaniem problemu przekłada się:

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

Chociaż jest to powszechne rozwiązanie problemu, nie jest tutaj odpowiednie, ponieważ alias typu naprawia parametry typu (na 'Int' i' Row'). Na przykład twój kod pozwala na wykonanie 'Matrix (" aze ", 123)' (zwracając 'List [Any]', co oczywiście jest ** nie ** tego samego typu co 'Matrix'), co z pewnością nie jest oczekiwane zachowanie. –

Powiązane problemy