Pie*_*sco 1 scala list pattern-matching
我正在尝试编写一个函数myfoo,它采用Int和一个int列表,验证int元素是否在列表中.如果int在列表中,它应返回"true",否则返回false.我已经写了这个函数,但是当我编译它时会返回这个错误:
error: type mismatch;
found : Unit
required: Boolean
breakable { for (i <-l) {
^
one error found*
Run Code Online (Sandbox Code Playgroud)
这是我的计划:
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"
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决?:)
这是如何实现可破解的
def breakable(op: => Unit) {
try {
op
} catch {
case ex: BreakControl =>
if (ex ne breakException) throw ex
}
}
Run Code Online (Sandbox Code Playgroud)
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"
}
Run Code Online (Sandbox Code Playgroud)
实现相同的功能方式(更好的方式)
def myFoo(num: Int, list: List[Int]): Boolean = list match {
case Nil => false
case `num` :: xs => true
case _ => myFoo(num, list.tail)
}
Run Code Online (Sandbox Code Playgroud)
下面的代码是相同的,但不使用后退滴答
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)
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
使用易碎性不是功能实践
使用异常暂停执行程序不起作用.功能编程主张通过类型的解释进行通信.内部可破坏通过抛出异常来停止控制流.以上第二种方式是在功能上解决问题的方法.