2016-12-12 31 views
1

我試圖編寫一個函數myfoo其中,取int和整數列表,驗證int元素是否在列表中。如果int在列表中,它應該返回「true」,否則返回false。 我已經寫了這個功能,但是當我編譯它,它返回此錯誤:在Scala中查找列表中的元素

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

我必須使用所必需的「匹配」鍛鍊構建! – Pierfrancesco

+0

你有沒有在任何地方指定「易碎」? – Pavel

+0

你還必須使用'breakable'嗎?如果不是,你應該匹配'l',並且沒有'for'。 –

回答

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

斯卡拉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 

使用易碎不是功能性的實踐

停止使用例外的程序的執行不是功能性的。函數式編程主張通過解釋類型進行交流。內部可斷開通過拋出異常停止控制流。 以上第二種方式是在功能上解決問題的方式。

+0

得到它!所以沒有辦法使用易碎來實現這個代碼? – Pierfrancesco

+0

@Pierfrancesco支票 – pamu

+0

非常感謝您的解答! :) – Pierfrancesco

0

您可以使用這一招,而不是

def function myFoo(x:Int, xList:List[Int]) = xList.contains(x) 

println(myFoo(1, List(1,2,3,4,5,6)))