2009-08-29 61 views
8

Tôi muốn tạo ra một lưu trữ cho các loại sau đây:Cách xác định danh sách các danh sách trong Scala?

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

Nhưng nếu tôi làm như sau:

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

sau đó nó tạo ra như niêm yết [AnyVal] và mang lại cho tôi lỗi nếu tôi cố gắng để thực hiện thao tác toán học:

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

Trả lời

3

Bạn có thể tìm thấy liên kết này hữu ích: http://debasishg.blogspot.com/2009/01/higher-order-abstractions-in-scala-with.html

Từ liên kết ở trên đây là một ví dụ về thực hiện một danh sách liệt kê:

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

Vì vậy, đối với vấn đề của bạn, bạn có thể muốn có:

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

Bằng cách này bạn loại bỏ bất kỳ vấn đề với loại suy luận.

1

Vài nhận xét:

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

Ý nghĩa, giống như câu hỏi "Java: my method wants the double type instead of float?":

Các 'f' ở phần cuối của số làm cho nó một phao thay vì một đôi.
Java sẽ không tự động thu hẹp một đôi thành phao.


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

làm việc quá


Chỉ cần thêm các loại rõ ràng sẽ không đủ:

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

Đó là cùng với một biến duy nhất:

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

Lưu ý: scala 2.7.5 thức tương đương 2.8 công việc tương tự ở đây. – VonC

9

Trong cả hai ví dụ của bạn, một danh sách chứa một số là Int (1 cuối trong trường hợp đầu tiên và 2 là phần tử đầu tiên của danh sách thứ hai), phần còn lại của các số là Doubles. Do đó, loại suy đoán của các phần tử danh sách sẽ là AnyVal, là loại siêu phổ biến đầu tiên của chúng, do đó danh sách bên ngoài của bạn sẽ trở thành Danh sách [Danh sách [AnyVal]].

Nếu bạn cũng dùng thử với scala 2.8 thì bạn nên sử dụng Số thay vì AnyVal, vì nó trở thành siêu kiểu của cả Double và Int. Hầu hết các phép toán số (nhân trong trường hợp của bạn) cũng sẽ hoạt động trên chúng.

Để khắc phục sự cố của bạn với 2.7.x, chỉ cần sử dụng Tăng gấp đôi cho các giá trị này (1.0 hoặc 1D).

Khai báo rõ ràng loại như Danh sách [Danh sách [Đôi]] cũng có thể hữu ích. Trong trường hợp này, giá trị Int mà bạn đưa ra sẽ được chuyển thành Doubles.

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

y(0)(0)*2 
1

này dường như đã được cố định trong 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 
Các vấn đề liên quan