2009-08-29 12 views
8

Vorrei creare un deposito per il seguente tipo:Come definire un elenco di liste in Scala?

List(List(2.3,1.1),List(2.2, 1)) 

Ma se faccio la seguente:

var y = List(List (1.0, 2.2), List(2, 1.1, -2.1)) 

poi crea la lista [AnyVal] e mi dà errore se provo per eseguire l'operazione matematica:

y(0)(0) * 2   // Error - value '2' is not a member of AnyVal 

risposta

3

Potete trovare questo link utile: http://debasishg.blogspot.com/2009/01/higher-order-abstractions-in-scala-with.html

dal link qui sopra ecco un esempio di fare una lista di liste:

val brs: List[List[String]] = 
    List(List("dave", "john", "sam"), List("peter", "robin", "david"), List("pras", "srim")) 

Quindi, per il vostro problema si consiglia di avere:

var y : List[List[Float]] = ... 

In questo modo si rimuove eventuali problemi con tipo di inferenza.

1

paio di osservazioni:

F:\prog\scala\scala-2.8.0.r18341-b20090718020201\bin>scala 
Welcome to Scala version 2.8.0.r18341-b20090718020201 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_13). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> var z = List(List (1.0, 2.2), List(2, 1.1, -2.1)) 
z: List[List[AnyVal]] = List(List(1.0, 2.2), List(2, 1.1, -2.1)) 

scala> var z = List(List (1.0f, 2.2f), List(2f, 1.1f, -2.1f)) 
z: List[List[Float]] = List(List(1.0, 2.2), List(2.0, 1.1, -2.1)) 

significato, come la domanda "Java: my method wants the double type instead of float?":

Il 'f' alla fine del numero rende un galleggiante invece di una doppia.
Java non restringerà automaticamente un doppio rispetto a un valore float.


scala> var z = (1.0f :: 2.2f :: Nil) :: (2f :: 1.1f :: -2.1f :: Nil) :: Nil 
z: List[List[Float]] = List(List(1.0, 2.2), List(2.0, 1.1, -2.1)) 

funziona anche


Basta aggiungere il tipo esplicito non sarebbe sufficiente:

scala> var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1)) 
<console>:4: error: type mismatch; 
found : Double(1.0) 
required: Float 
     var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1)) 
              ^
<console>:4: error: type mismatch; 
found : Double(2.2) 
required: Float 
     var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1)) 
               ^
<console>:4: error: type mismatch; 
found : Double(1.1) 
required: Float 
     var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1)) 
                   ^
<console>:4: error: type mismatch; 
found : Double(-2.1) 
required: Float 
     var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1)) 
                    ^

che è lo stesso con un unico variabile:

scala> var f : Float = -2.1 
<console>:4: error: type mismatch; 
found : Double(-2.1) 
required: Float 
     var f : Float = -2.1 
        ^

scala> var f : Float = -2.1f 
f: Float = -2.1 
+0

Nota: Scala 2.7.5 finale o 2,8 lavoro lo stesso qui. – VonC

9

In entrambi i casi un elenco contiene un numero che è un Int (ultimo 1 nel primo caso e 2 è il primo elemento del secondo elenco), il resto dei numeri è doppio. Quindi il tipo inferito degli elementi della lista sarà AnyVal, che è il primo supertipo comune di essi, quindi la lista esterna diventerà List [List [AnyVal]].

Se si prova anche con scala 2.8, è necessario utilizzare Numeric anziché AnyVal, in quanto è diventato il supertipo di Double e Int. Anche le operazioni più numeriche (moltiplicazione nel tuo caso) funzioneranno su di esse.

Per risolvere il problema con 2.7.x basta usare Doppio per questi valori (1.0 o 1D).

Sarà probabilmente utile anche dichiarare esplicitamente il tipo Elenco [Elenco [Doppio]]. In questo caso i valori di Int che hai dato saranno convertiti in Doubles.

0
var y:List[List[Double]] = List(List (1.0, 2.2), List(2, 1.1, -2.1)) 

y(0)(0)*2 
1

Questo sembra essere stato fissato a Scala 2,9

Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> var y = List(List (1.0, 2.2), List(2, 1.1, -2.1)) 
y: List[List[Double]] = List(List(1.0, 2.2), List(2.0, 1.1, -2.1)) 

scala> y(0)(0) * 2 
res0: Double = 2.0 
Problemi correlati