[英]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.