2009-08-29 13 views
8

Chciałbym utworzyć magazynowania dla następującego typu:Jak zdefiniować listę list w Scali?

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

Ale jeśli wykonaj następujące czynności:

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

to tworzy jako listę [AnyVal] i daje mi błąd, gdy próbuję do wykonywania operacji matematycznych:

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

Odpowiedz

3

można znaleźć ten link przydatne: http://debasishg.blogspot.com/2009/01/higher-order-abstractions-in-scala-with.html

z linku powyżej tutaj jest przykładem podejmowania listę list:

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

Tak, dla swojego problemu może chcesz mieć:

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

W ten sposób można usunąć wszelkie problemy z typ wnioskowania.

1

Kilka uwag:

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

znaczenie, jak na pytanie "Java: my method wants the double type instead of float?":

'F' na końcu numeru sprawia, że ​​pływak zamiast podwójne.
Java nie będzie automatycznie zawężać podwójnej do wartości zmiennoprzecinkowej.


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

działa zbyt


Wystarczy dodanie wyraźnego typu nie byłoby tyle:

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

To samo jest z jednej zmiennej:

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

Uwaga: scala 2.7.5 final lub 2.8 działa tak samo tutaj. – VonC

9

W obu przykładach jedna lista zawiera jedną liczbę, która jest int (ostatnie 1 w pierwszym przypadku i 2 jako pierwszy element na drugiej liście), pozostałe liczby są podwójne. Dlatego też wywnioskowany typ elementów listy będzie AnyVal, który jest pierwszą wspólną nadtypem ich, więc twoja zewnętrzna lista stanie się List [List [AnyVal]].

Jeśli spróbujesz go również przy pomocy scala 2.8, to powinien użyć Numeric zamiast AnyVal, ponieważ stał się on nadtypem zarówno Double, jak i Int. Większość operacji numerycznych (mnożenie w twoim przypadku) również na nich działa.

Aby rozwiązać problem w wersji 2.7.x, po prostu użyj podwójnych wartości (1.0 lub 1D).

Jawnie deklarowanie typu jako Lista [Lista [Podwójnie]] prawdopodobnie również pomoże. W tym przypadku wartości Int, które podałeś, zostaną zamienione na Podwójne.

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

y(0)(0)*2 
1

Wydaje się to zostały ustalone w 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 
Powiązane problemy