簡體   English   中英

Scala 簡單 function 返回類型不匹配錯誤

[英]Scala simple function returns type mismatch error

我有一個向量列表。 每個向量以Vector(Double,Double)的形式表示一個范圍。 我想創建一個 function 給定一個輸入數字,找到它包含在哪個向量中並返回該向量的索引。 我不知道是否有更簡單的方法,我是 Scala 的新手,但我的代碼如下:

val vectors = #List of vectors ( List[scala.collection.immutable.IndexedSeq[Double]] )

def in_range(start: Double, end: Double, x : Double): Boolean = {(x>= start && x<end)}

def find_index(x:Double): Int = {
    for(i <- 0 to n){
     if( in_range(vectors(i)(0),vectors(i)(1),x)){ 
        return i
     }
}

我收到以下錯誤:

<console>:28: error: type mismatch;
 found   : Unit
 required: Int
        for(i <- 0 to 10){
              ^

如果for在沒有返回值的情況下終止,它將返回Unit而不是所需的Int ,因此會返回錯誤消息。

但是對於這類事情,您應該查看諸如find之類的方法,而不是遍歷集合的索引。 例如

def find_index(x: Double): Int =
  vectors.indexWhere(v => in_range(v(0), v(1), x))

您的代碼中有很多錯誤,讓我們一一修復。

最重要的是Scala沒有return (嗯,它確實存在,但你不應該使用它
Scala中,塊的返回是其最后一個表達式的返回。 因此,在您的情況下, find_index的返回是for(){...}的返回,這實際上不是for loop ,而是for comprehension 如果您閱讀過文檔,您就會知道它對一個簡單的foreach調用進行了簡化,該調用返回Unit ,而不是Int

所以,你可以用這個來欺騙編譯器:

def find_index(x:Double): Int = {
    for(i <- 0 to n){
     if( in_range(vectors(i)(0),vectors(i)(1),x)){ 
        return i
     }
     -1 // default return value.
}

但這只是 Scala 中的錯誤代碼。 You may be used to old imperative loops (for the way you name things, I assume you have a Python background) but Scala is not a another OOP language, it is a mix between FP and OOP.
而且,即使 Scala 允許您成為命令式,您會發現該語言為您提供了許多有用的工具來簡化代碼。

其他一些錯誤包括:語法錯誤,使用向量而不是元組來表示元組,以及假設您總是可以返回一個值。

代碼的更慣用版本是。

def inRange(start: Double, end: Double, x: Double): Boolean =
  x >= start && x < end

def findIndex(vectors: List[(Double, Double)])(x: Double): Option[Int] =
  vectors.iterator.zipWithIndex.collectFirst {
    case ((start, end), idx) if (inRange(start, end, x)) => idx
  }

旁注,通常我們不會那么多地使用索引。 也許您實際上想要元組而不是元組的索引?

您可以使用如下:

findIndex(List((0, 3), (3, 5), (8, 10)))(3)
// res: Option[Int] = Some(1)
// A index was found.

findIndex(List((0, 3), (3, 5), (8, 10)))(6)
// res: Option[Int] = None
// A index was not found.

順便說一句,這些是不遵循任何實際 Scala 課程而只閱讀語法的人會犯的錯誤。 正如我之前所說,這不僅僅是另一種 OOP 語言,您需要的不僅僅是語法來理解和有效地使用 Scala,它需要范式轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM