Возврат в цикле Scala For

Я новичок в Scala, поэтому сначала пытаюсь сделать простую вещь.

Я написал метод, который находится ниже.

//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 пытается мне что-то сказать, а я просто не могу этого понять. Что может быть причиной этой ошибки?


person ashutosh raina    schedule 03.02.2013    source источник
comment
Хотя в Scala есть ключевое слово return, редко рекомендуется (и, осмелюсь сказать, никогда не идиоматично Scala) использовать его.   -  person Randall Schulz    schedule 03.02.2013
comment
Я до сих пор не вижу необходимости понижать голос... Люди не пишут идиоматический javascript/clojure или любой другой язык в вопросах, которые они задают, значит ли это, что мы должны отрицать каждый вопрос?   -  person ashutosh raina    schedule 04.02.2013
comment
Я не голосовал против вопроса. Я думаю, что это совершенно правильный вопрос. Я согласен, мы здесь для того, чтобы направлять спрашивающих к хорошему коду Scala, а не наказывать их за то, что они еще не узнали то или иное о Scala.   -  person Randall Schulz    schedule 04.02.2013


Ответы (2)


for в Scala не является for loop, на самом деле это вообще не цикл. Это синтаксический сахар для карт, плоских карт и других монадических возможностей. Монады очень полезны в функциональном программировании, я рекомендую потратить некоторое время на их изучение; вы можете начать с http://james-iry.blogspot.com/2007/09/monads-are-elephants-part-1.html , следите за всей серией. Спасибо замечательному мистеру Джеймсу Айри.

Если вам просто нужен первый элемент, соответствующий вашему запросу, попробуйте это

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

Возможные значения для findFirst:

  1. Some(n), если что-то было найдено, где n — найденное Int
  2. Нет, если ничего не найдено
person user1779032    schedule 03.02.2013
comment
def FindFirstMultiple (вход: List [Int]): Int = { input.find (i => i % 7 == 0).getOrElse (0) } - person user1779032; 03.02.2013
comment
Да, это сработает. Но как бы вы сделали то же самое с циклом for? - person ashutosh raina; 03.02.2013
comment
В Scala нет циклов for. - person Dominic Bou-Samra; 03.02.2013

Если вы хотите запустить это с помощью цикла for, вам также нужно добавить возврат 0, как в

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

Конечное значение необходимо, так как for сам по себе ничего не возвращает, если if не выполняется.

Как предложил пользователь 1779032, лучший способ -

def FindFirstMultiple(input: List[Int]) = input.find(i => i % 7 == 0).getOrElse(0)  
person Arnon Rotem-Gal-Oz    schedule 03.02.2013