2016-12-12 4 views
1

함수를 작성하려합니다. 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

내가 운동에 대해 "일치"건설에 필요한 사용할 필요는이 트릭을 사용할 수 있습니다! – 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 마지막을 구현하는 방법을 깨뜨릴 수있다. 그래서 컴파일러가 불평하는 이유입니다.

해결 방법은 다음과 같습니다. 내가 코드 아래 같은

def myFoo(num: Int, list: List[Int]): Boolean = list match { 
    case Nil => false 
    case `num` :: xs => true 
    case _ => myFoo(num, list.tail) 
    } 

을 구현하는 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 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

가져 오기! 따라서 breakable을 사용하여이 코드를 구현할 방법이 없습니까? – 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)))