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 循环运行它,你还需要添加一个 return 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

for在 Scala 中不是 a for loop,实际上它根本不是循环。它是 map 和 flatMap 以及其他单子好东西的语法糖。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. Some(n) 如果找到了某些东西,其中 n 是找到的 Int
  2. 如果什么也没找到,则无
于 2013-02-03T11:46:53.377 回答