2009-08-29 17 views
8

me gustaría crear un almacenamiento para el siguiente tipo:¿Cómo se define una lista de listas en Scala?

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

Pero si hago lo siguiente:

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

entonces se crea una lista [AnyVal] y me da error si intento para llevar a cabo la operación matemática:

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

Respuesta

3

Usted puede encontrar este enlace útil: http://debasishg.blogspot.com/2009/01/higher-order-abstractions-in-scala-with.html

Desde el enlace de arriba aquí es un ejemplo de hacer una lista de listas:

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

Por lo tanto, para su problema es posible que desee tener:

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

De esta manera se elimina cualquier problema con escriba inferencia

1

par de comentarios:

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)) 

Significado, como la pregunta "Java: my method wants the double type instead of float?":

La 'f' al final de la serie hace que sea un flotador en vez de una doble.
Java no reducirá automáticamente un doble a un flotante.


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)) 

también funciona


Simplemente añadiendo el tipo explícito no sería suficiente:

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)) 
                    ^

Eso es lo mismo con una sola variable:

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 final o 2,8 trabajo lo mismo aquí. – VonC

9

En ambos ejemplos, una lista contiene un número que es un Int (último 1 en el primer caso y 2 como el primer elemento de la segunda lista), el resto de los números son Dobles. Por lo tanto, el tipo inferido de los elementos de la lista será AnyVal, que es el primer supertipo común de ellos, por lo que su lista externa se convertirá en List [List [AnyVal]].

Si también lo prueba con scala 2.8 entonces debería usar Numeric en lugar de AnyVal, ya que se convirtió en el supertipo de Double e Int. La mayoría de las operaciones numéricas (multiplicación en su caso) también funcionarán en ellos.

Para solucionar su problema con 2.7.x simplemente use Dobles para estos valores (1.0 o 1D).

Declarar explícitamente el tipo como Lista [Lista [Doble]] probablemente también ayude. En este caso, los valores Int que dio se convertirán a Dobles.

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

y(0)(0)*2 
1

Este parece haber sido fijado en 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 
Cuestiones relacionadas