我想为以下类型创建一个存储空间:
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
答案 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