2016-12-12 12 views
1

私は関数int0とintのリストを取って、int要素がリストにあるかどうかを確認する関数myfooを書こうとしています。 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最終的にどのように実装されるか破壊可能です。だからコンパイラが不平を言っている理由です。

これを修正する方法が1つあります。私は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 

は機能していない例外を使用してプログラムの実行の停止機能の練習

ではありません。機能プログラミングは、タイプの解釈を通じて通信することを支持する。内部破壊可能性は、例外をスローすることによって制御フローを停止させます。 上記の2つ目の方法は、問題を機能的に解決する方法です。

+0

それを入手!したがって、このコードをブレーク可能に実装する方法はありませんか? – Pierfrancesco

+0

@Pierfrancesco check – 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))) 
関連する問題