2012-10-31 12 views
5

Sto provando a scrivere un metodo inverso in Scala che accetta un elenco e restituisce il contrario. Ho:Errore di disallineamento tipo Scala nel ciclo for

object Reverse { 
    def reverseList(list: List[Int]): List[Int] = { 
    var reversed: List[Int] = List() 
    for (i <- list) { 
     reversed = i :: reversed 
    } 
    } 
    def main(args: Array[String]) { 
    println(reverseList(List(1,2,3,4))) 
    } 
} 

Ma quando provo a compilare, sto ottenendo:

example.scala:4: error: type mismatch; 
found : Unit 
required: List[Int] 
    for (val i <- list) { 
      ^

The List "lista" è stato dichiarato di essere di tipo List [Int]. Perché viene riconosciuto come tipo Unità?

+2

sua non si lamenta che la lista è di tipo sbagliato, ma l'espressione di unità ritorna quando Lista tipo restituito os [Int] è previsto – Arjan

+0

E 'questo per un lavoro/esercizio? In secondo luogo si potrebbe semplicemente usare il metodo 'reverse' di' Seq' – drexin

risposta

4

Aggiungi reversed dopo il ciclo for. In Scala l'ultima riga di una funzione è il valore di ritorno. Il for (i <- list){...} restituisce Unit.

object Reverse { 
    def reverseList(list: List[Int]): List[Int] = { 
    var reversed: List[Int] = List() 
    for (i <- list) { 
     reversed = i :: reversed 
    } 
    reversed 
    } 
    def main(args: Array[String]) { 
    println(reverseList(List(1,2,3,4))) 
    } 
} 
+0

Grazie, che lo ha completamente risolto. Non riesco ancora a capire perché stavo ottenendo un errore di mancata corrispondenza di tipo. La lista delle variabili non dovrebbe ancora essere riconosciuta come è stata dichiarata? – user1789874

+0

guarda il mio commento – Arjan

+0

La mancata corrispondenza del tipo è perché la funzione 'reverseList' si aspetta un tipo di ritorno di' List [Int] 'ma' Unit' viene effettivamente restituito dall'espressione 'for'. Aggiungendo 'invertito' come ultima riga nelle modifiche, il tipo di ritorno da' Unità' a 'Elenco [Int]' e l'errore di mancata corrispondenza del tipo è corretto. – Brian