我正在尝试编写一个函数 myfoo ,它使用Int和一个int列表来验证int元素是否在列表中。如果int在列表中,它应返回“true”,否则返回false。 我已经写了这个函数,但是当我编译它时会返回这个错误:
error: type mismatch;
found : Unit
required: Boolean
breakable { for (i <-l) {
^
one error found*
这是我的计划:
import scala.util.control.Breaks._
object findEl extends App{
def myfoo (x:Int,l:List[Int]):Boolean={
breakable { for (i <-l) {
i match {
case a if (a==x) => true
case _ => false
break
}
}
}
}
println(myfoo(1,List(1,2,3,4))) //should print "true"
}
我该如何解决? :)
答案 0 :(得分:5)
这是如何实现可破解的
def breakable(op: => Unit) {
try {
op
} catch {
case ex: BreakControl =>
if (ex ne breakException) throw ex
}
}
最终可破坏的返回Unit
。这就是编译器抱怨的原因。
以下是解决此问题的一种方法。请注意我正在使用var
import scala.util.control.Breaks._
object findEl extends App {
def myfoo(x: Int, l: List[Int]): Boolean = {
var res: Boolean = false
breakable {
for (i <- l) {
i match {
case a if a == x => res = true
break
case _ => ()
}
}
}
res
}
println(myfoo(1, List(1, 2, 3, 4))) //should print "true"
}
实施相同的功能方式(更好的方式)
def myFoo(num: Int, list: List[Int]): Boolean = list match {
case Nil => false
case `num` :: xs => true
case _ => myFoo(num, list.tail)
}
下面的代码相同,但不使用反向标记
def myFoo(num: Int, list: List[Int]): Boolean = list match {
case Nil => false
case x :: xs if x == num => true
case _ => myFoo(num, list.tail)
}
Scala REPL
scala> def myFoo(num: Int, list: List[Int]): Boolean = list match {
| case Nil => false
| case `num` :: xs => true
| case _ => myFoo(num, list.tail)
| }
myFoo: (num: Int, list: List[Int])Boolean
scala> myFoo(1, List(2, 1, 2))
res0: Boolean = true
使用breakable不是功能练习
使用异常暂停执行程序不起作用。功能编程主张通过类型的解释进行通信。内部可破坏通过抛出异常来停止控制流。 以上第二种方式是在功能上解决问题的方法。
答案 1 :(得分:0)
你可以使用这个技巧
def function myFoo(x:Int, xList:List[Int]) = xList.contains(x)
println(myFoo(1, List(1,2,3,4,5,6)))