Scala:奇怪的类型不匹配错误

Vil*_*tas 1 arrays scala range

假设我有一个这样的函数(它只是一个例子,所以不要给我更好的方法来创建0,1,2,...样式数组):

def createArray(size: Int): Array[Int] = {
  for (i <- 0 until size) yield i
}
Run Code Online (Sandbox Code Playgroud)

但编译器因一些神秘的类型不匹配错误而感到不安:

(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>
Run Code Online (Sandbox Code Playgroud)

我敢肯定,原因与until方法的返回类型Range不是这样的事实有关Array.然而,为什么编译器不能只是转换类型?有趣的是,当我删除函数的返回类型时,问题就消失了:

def createArray(size: Int) = {
  for (i <- 0 until size) yield i
}
Run Code Online (Sandbox Code Playgroud)

但我希望我的功能能够回归Array......

我还有另一个功能,如下所示:

def screateArray2: Array[Int] = {
  val a = Array(1,2,3,4,5)
  for (i <- a) yield i
}
Run Code Online (Sandbox Code Playgroud)

它编译没有任何问题.它产生的值与第一个示例非常相似,但直到方法才使用...

我是否遗漏了Scala的类型系统?

我对Scala很新.

编辑:我有点像这样解决了我的问题:

def crop(data: Array[Int]): Array[Int] = (
  for (i <- 0 until data.size) yield i
).toArray
Run Code Online (Sandbox Code Playgroud)

但在我看来,它是可读的......

Arj*_*ijl 5

您不能仅仅因为Array不是Range,也不是它的超类来转换类型.我认为他们最常见的超类型是IndexedSeq.因此,您的示例类似于您声明返回Int的方法,而实现将返回String,例如.toArray但是,Range确实有一个方法,所以如果你想使用until样式并返回一个数组,你可以这样做:


scala> (for (i <- 0 until 5) yield i).toArray
res0: Array[Int] = Array(0, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

或者,如果不喜欢这样,还有另一种方式,但不使用直到样式:


scala> for (i <- Array.range(0,5)) yield i          
res1: Array[Int] = Array(0, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

另外,请检查此相关问题,以便从理解中返回自定义类型