在Scala中的列表中查找元素

时间:2016-12-12 20:50:15

标签: 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*   

这是我的计划:

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"
}

我该如何解决? :)

2 个答案:

答案 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)))