2013-02-03 165 views
0

我是Scala的新手,所以想要先做簡單的事情。返回Scala For循環

我寫了一個方法如下。

//Given a list of numbers find the first number that is a multiple of 7 
    def FindFirstMultiple(input: List[Int]) : Int = { 
    for (
     i <- input   
     if (i % 7 == 0) 
     ) 
     return i   
    } 

該方法給出錯誤

type mismatch; found : Unit required: Int 

我不能夠理解這一點。當我沒有返回類型並只打印值時,它可以正常工作。 此外,爲什麼錯誤波動懸停在i <- input。我認爲Scala編譯器試圖告訴我一些東西,但我無法理解它。這個錯誤的原因是什麼?

+1

雖然斯卡拉確實有'return'關鍵字,它很少建議(和,我敢說,從來沒有慣用的Scala)來使用它。 –

+0

我還是沒有看到需要downvote ....人們不會在他們問的問題中編寫慣用的javascript/clojure或任何其他語言,那麼這是否意味着我們應該減少每個問題? –

+0

我沒有投票反對這個問題。我認爲這是一個完全有效的問題。我同意,我們在這裏引導提問者朝向好的Scala代碼,而不是因爲他們還沒有學過關於Scala的一件事而懲罰他們。 –

回答

2

for斯卡拉不是for loop,實際上它根本不是一個循環。這是一個map和flatMap以及其他monadic好吃的語法糖。 Monad在函數式編程中非常有用,我建議你花些時間學習它們;你可以從http://james-iry.blogspot.com/2007/09/monads-are-elephants-part-1.html開始,按照整個系列。 感謝James Iry先生。

如果你只是想你的查詢匹配的第一個項目,試試這個

val findFirst:Option[Int] = input.find(i => i % 7 == 0) 

更多鈔票值findFirst

  1. 一些(N)如果事情被發現,其中n是詮釋找到
  2. 如果沒有發現任何東西
+0

nope this does work .. I get the same compiler message –

+0

def FindFirstMultiple(input:List [Int]):Int = {input.find(i => i%7 == 0).getOrElse(0)} – user1779032

+0

Yes這將工作。但是,如何用for循環完成相同的操作? –

4

如果您想要與一個運行for循環,你需要在

def FindFirstMultiple(input: List[Int]) : Int = { 
    for (i <- input if (i % 7 == 0)) return i 
    0  
    } 

需要的終值也加一個return 0 作爲作爲如果不滿意時,本身不返回任何東西。

由於user1779032提出了一個更好的辦法是

def FindFirstMultiple(input: List[Int]) = input.find(i => i % 7 == 0).getOrElse(0)