如何在Scala中定义列表列表?

时间:2009-08-29 04:29:54

标签: scala

我想为以下类型创建一个存储空间:

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

但如果我这样做:

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

然后它创建为List [AnyVal]并在我尝试执行数学运算时给出错误:

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

5 个答案:

答案 0 :(得分:9)

在两个示例中,一个列表包含一个作为Int的数字(第一个案例中的最后一个,第二个列表中的第一个元素),其余的数字是双打。 因此列表元素的推断类型将是AnyVal,这是它们的第一个常见超类型,因此您的外部列表将成为List [List [AnyVal]]。

如果你也尝试使用scala 2.8,那么它应该使用Numeric而不是AnyVal,因为它成为Double和Int的超类型。大多数数值运算(在你的情况下是乘法)也适用于它们。

要解决2.7.x的问题,只需使用双打来获取这些值(1.0或1D)。

明确地将类型声明为List [List [Double]]可能也会有所帮助。在这种情况下,您给出的Int值将转换为Doubles。

答案 1 :(得分:3)

您可能会发现此链接很有用: http://debasishg.blogspot.com/2009/01/higher-order-abstractions-in-scala-with.html

从上面的链接中可以看到列表清单:

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

因此,对于您的问题,您可能希望:

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

这样就可以消除类型推断的任何问题。

答案 2 :(得分:1)

几位评论:

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

意思,就像问题“Java: my method wants the double type instead of float?”:

  

数字末尾的'f'使其成为浮点数而不是双数   Java不会自动将double缩小为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))

也有效


仅添加显式类型是不够的:

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

单个变量也是如此:

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

答案 3 :(得分:1)

这似乎已在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

答案 4 :(得分:0)

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

y(0)(0)*2