1

私は 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 コンパイラーが私に何かを伝えようとしているのだと思いますが、私にはそれが理解できません。このエラーの原因は何ですか?

4

2 に答える 2

5

これをforループで実行する場合は、次のように戻り値0も追加する必要があります。

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

ifが満たされない場合、for自体は何も返さないため、終了値が必要です。

user1779032が提案したように、より良い方法は

def FindFirstMultiple(input: List[Int]) = input.find(i => i % 7 == 0).getOrElse(0)  
于 2013-02-03T12:17:07.553 に答える
2

forin Scala は ではなく、for loop実際にはまったくループではありません。これは、map と flatMap およびその他のモナド グッズのシンタックス シュガーです。モナドは関数型プログラミングで非常に便利です。時間をかけて学習することをお勧めします。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. 何も見つからなかった場合はなし
于 2013-02-03T11:46:53.377 に答える