-1

I have a method defined as below and wanted to combine pattern match. The or operator give me compiler error (||).

def isPaired(input: String): Boolean = {

    def go(x: List[Char], level: Int = 0): Boolean = {
      x match {
        case Nil => true
        case '(' :: xs1 if level < 0 => false
        case '[' :: xs1 if level < 0 => false
        case '{' :: xs1 if level < 0 => false
        case ')' :: xs1 if level == 0 => false
        case ']' :: xs1 if level == 0 => false
        case '}' :: xs1 if level == 0 => false
        case '(' :: xs1 => go(xs1, level + 1)
        case '[' :: xs1 => go(xs1, level + 1)
        case '{' :: xs1 => go(xs1, level + 1)
        case ')' :: xs1 => go(xs1, level - 1)
        case ']' :: xs1 => go(xs1, level - 1)
        case '}' :: xs1 => go(xs1, level - 1)
        case _ :: xs1 => go(xs1, level + 1)
      }

    }
    go(input.toList)
  }

The below gives compiler error:

case '(' :: xs1 || '[' :: xs1 || '{' :: xs1  if level < 0 => false
case ('(' :: xs1) || ('[' :: xs1) || ('{' :: xs1)  if level < 0 => false

How to apply or condition?

Valy Dia
  • 2,781
  • 2
  • 12
  • 32
Aavik
  • 967
  • 19
  • 48

1 Answers1

2

There are several issue with what you tried:

  1. You are using the || (Or operator) instead of the | (Pipe operator) to represent multiple case, as @Luis commented - see this question
  2. You are to try to reference a variable when multiple case are combined - see this question

So what you can try indeed is:

def isPaired(input: String): Boolean = {

    def go(x: List[Char], level: Int = 0): Boolean = {
      x match {
        case Nil => true
        case ('(' | '[' | '{') :: xs1 if level < 0 => false
        case ')' :: xs1 if level == 0 => false
        case ']' :: xs1 if level == 0 => false
        case '}' :: xs1 if level == 0 => false
        case '(' :: xs1 => go(xs1, level + 1)
        case '[' :: xs1 => go(xs1, level + 1)
        case '{' :: xs1 => go(xs1, level + 1)
        case ')' :: xs1 => go(xs1, level - 1)
        case ']' :: xs1 => go(xs1, level - 1)
        case '}' :: xs1 => go(xs1, level - 1)
        case _ :: xs1 => go(xs1, level + 1)
      }

    }
    go(input.toList)
  }

Or even more condensed:

def isPaired(input: String): Boolean = {

    def go(x: List[Char], level: Int = 0): Boolean = {
      x match {
        case Nil => true
        case ('(' | '[' | '{') :: xs1 if level < 0 => false
        case (')' | ']' | '}') :: xs1 if level == 0 => false
        case ('(' | '[' | '{') :: xs1 => go(xs1, level + 1)
        case (')' | ']' | '}') :: xs1 => go(xs1, level - 1)
        case _ :: xs1 => go(xs1, level + 1)
      }

    }
    go(input.toList)
  }
Valy Dia
  • 2,781
  • 2
  • 12
  • 32