Допустим, у меня есть такая функция (это только пример, поэтому не предлагайте мне лучшие способы создания массива стилей 0,1,2, ...):
def createArray(size: Int): Array[Int] = {
for (i <- 0 until size) yield i
}
Но компилятор расстраивается из-за загадочной ошибки несоответствия типов:
(fragment of compare-images.scala):39: error: type mismatch;
found : RandomAccessSeq.Projection[Int]
required: Array[Int]
for (i <- 0 until size) yield i
^
one error found
!!!
discarding <script preamble>
Я уверен, причина в том, что тип возвращаемого метода until
равен Range
, а не Array
. Но почему компилятор не может просто приводить типы?
Интересно, что проблема исчезает, когда я удаляю тип возврата моей функции:
def createArray(size: Int) = {
for (i <- 0 until size) yield i
}
Но я хочу, чтобы моя функция возвращала Array
...
У меня также есть другая функция, которая выглядит следующим образом:
def screateArray2: Array[Int] = {
val a = Array(1,2,3,4,5)
for (i <- a) yield i
}
Компилируется без проблем. Он выдает значения очень похоже на первый пример, но не использует пока метод ...
Я что-то упускаю из системы типов Scala?
Я довольно новичок в Scala.
РЕДАКТИРОВАТЬ: я вроде как решил мою проблему следующим образом:
def crop(data: Array[Int]): Array[Int] = (
for (i <- 0 until data.size) yield i
).toArray
Но, на мой взгляд, это совсем не читабельно ...