tokola
tokola

Reputation: 257

Why is this matching not allowed in scala?

I have to find if an element is inside a list using scala, and I am only allowed to use recursion. Why is the following code not working, as the match statement seems to be correct to me. My IDE gives me an error on all three case statements and it says type, mistmatch, boolean required.

def isInN(x: Int, l: List[Int]): Boolean = (l,l.head) match {
  case Nil,_ => false
  case _,x => true
  case _,_ => isInN (x,l.tail)
}

Upvotes: 1

Views: 80

Answers (1)

Michael Zajac
Michael Zajac

Reputation: 55569

You're matching a tuple, so you need to use a proper tuple extractor. i.e. just add parenthesis:

def isInN(x: Int, l: List[Int]): Boolean = (l, l.head) match {
    case (Nil, _) => false
    case (_, x) => true
    case (_, _) => isInN (x, l.tail)
}

This compiles, but won't quite work like you want it to. l.head will throw an exception if the list is empty. And x within the match will eagerly match anything, so the last case can never be reached. To match against an identifier, you need to surround it with backticks, otherwise it will just be a placeholder matcher.

To use a similar pattern match without calling l.head, you can pattern match on the List itself:

def isInN(x: Int, l: List[Int]): Boolean = l match {
    case Nil => false
    case `x` :: _ => true
    case head :: tail => isInN (x, tail)
}

Though this is all trumped by contains in the standard collections library:

scala> List(1, 2, 3, 4).contains(2)
res5: Boolean = true

Upvotes: 8

Related Questions