Сопоставление шаблонов Scala в последовательностях, отличных от списков

У меня есть следующий код, который рекурсивно работает с каждым элементом внутри Список

def doMatch(list: List[Int]): Unit = list match {
  case last :: Nil  => println("Final element.")
  case head :: tail => println("Recursing..."); doMatch(tail)
}

Теперь, игнорируя то, что эта функция доступна через filter () и foreach () , это работает нормально. Однако, если я попытаюсь изменить его, чтобы принять любой Seq [Int] , я столкнусь с проблемами:

  • Seq не имеет ::, но у него есть + :, что, как я понимаю, в основном то же самое. Однако, если я попытаюсь сопоставить head +: tail, компилятор выдает сообщение «error: not found: value +:»
  • Nil специфичен для List, и я не уверен, чем его заменить. Я собираюсь попробовать Seq (), если я когда-нибудь справлюсь с предыдущей проблемой

Вот как, я думаю, должен выглядеть код, за исключением того, что он не работает:

def doMatch(seq: Seq[Int]): Unit = seq match {
  case last +: Seq() => println("Final element.")
  case head +: tail  => println("Recursing..."); doMatch(tail)
}

Редактировать: Так много хороших ответов! Я принимаю ответ agilesteel, поскольку он первым заметил, что :: не оператор в моем примере, а класс case и, следовательно, разница.

56
задан Zecrates 25 July 2011 в 09:49
поделиться