Как определить список списков в Scala? - PullRequest
8 голосов
/ 29 августа 2009

Я хотел бы создать хранилище для следующего типа:

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 ]

9 голосов
/ 29 августа 2009

В обоих ваших примерах один список содержит одно число, представляющее собой Int (последнее 1 в первом случае и 2 в качестве первого элемента второго списка), остальные числа - двойные. Следовательно, предполагаемый тип элементов списка будет AnyVal, который является первым общим супертипом из них, поэтому ваш внешний список станет List [List [AnyVal]].

Если вы также попробуете это с scala 2.8, тогда он должен использовать Numeric вместо AnyVal, так как он стал супертипом Double и Int. Большинство числовых операций (умножение в вашем случае) также будут работать с ними.

Чтобы исправить вашу проблему с 2.7.x, просто используйте Doubles для этих значений (1.0 или 1D).

Явное объявление типа как List [List [Double]], вероятно, также поможет. В этом случае значения Int, которые вы указали, будут преобразованы в Double.

3 голосов
/ 29 августа 2009

Вы можете найти эту ссылку полезной: 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]] = ...

Таким образом вы устраните все проблемы с выводом типа.

1 голос
/ 30 июня 2011

Это, похоже, исправлено в 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
1 голос
/ 29 августа 2009

Пара замечаний:

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: мой метод хочет двойной тип вместо float? ":

'f' в конце числа делает его плавающим вместо двойного.
Java не будет автоматически сужать двойное число до числа с плавающей точкой.


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
0 голосов
/ 31 августа 2009
var y:List[List[Double]] = List(List (1.0, 2.2), List(2, 1.1, -2.1))

y(0)(0)*2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...