Определенно стоит изучить или энергию или emacs. Также стоит учиться печатать слепым методом. В обоих случаях причинами является то же: Ваши взгляды больше не прерываются механическим процессом получения Вашего кода на экран .
относительно того, как запустить, просто погрузиться в и начать использовать энергию для всего.
P.S. Дебаты emacs-vs-vi бесконечны. Я использовал emacs в течение 26 лет. Если бы я запустил снова сегодня, то я изучил бы энергию потому что (a) это поправилось и (b) существуют много, меньше модифицирующих клавиш (Ctl-Alt-V, любой) и пользователи энергии, кажется, получает намного меньше травмы ввода.
В обоих ваших примерах один список содержит одно число, которое является Int (последний 1 в первом случае и 2 как первый элемент второго list), остальные числа - двойные. Следовательно, предполагаемым типом элементов списка будет AnyVal, который является первым общим супертипом из них, поэтому ваш внешний список станет List [List [AnyVal]].
Если вы также попробуете его с scala 2.8, тогда он должен использовать Numeric вместо AnyVal, поскольку он стал супертипом как Double, так и Int. Большинство числовых операций (в вашем случае умножение) также будут работать с ними.
Чтобы решить вашу проблему с 2.7.x, просто используйте Doubles для этих значений (1.0 или 1D).
Явное объявление типа как List [List [ Double]], вероятно, тоже поможет. В этом случае введенные вами значения Int будут преобразованы в двойные.
Эта ссылка может оказаться полезной: 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]] = ...
Таким образом вы устраните все проблемы с выводом типа.
Пара замечаний:
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: моему методу нужен тип double вместо float? »:
'f' в конце числа делает его числом с плавающей запятой вместо двойного.
Java не будет автоматически сужать число double до числа с плавающей запятой.
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
var y:List[List[Double]] = List(List (1.0, 2.2), List(2, 1.1, -2.1))
y(0)(0)*2