case class - комбинировать сопоставление с образцом - PullRequest
0 голосов
/ 01 июля 2019

У меня есть метод, определенный ниже, и я хотел бы объединить сопоставление с образцом. Оператор or выдает ошибку компиляции (||).

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

Ниже приведена ошибка компилятора:

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

Как подать заявку или состояние?

1 Ответ

2 голосов
/ 02 июля 2019

Есть несколько проблем с тем, что вы пытались:

  1. Вы используете || (оператор Or) вместо | (Pipe оператор) для представления нескольких случаев, как прокомментировал @Luis - см. этот вопрос
  2. Вы должны попытаться ссылаться на переменную при объединении нескольких регистров - см. этот вопрос

Итак, что вы действительно можете попробовать:

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

Или даже более сжато:

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