Конец / середина списка соответствия шаблону в Scala

Может кто-нибудь дать мне более простое решение для следующего кода (который разворачивает список целых чисел задана структура 0xFC :: len :: payload :: ... :: 0x0A :: 0x0D ):

object Payload {
  def unapply(z: List[Int]): Option[List[Int]] = if (z.length == z.head + 1) Some(z tail) else None
}

object EndToken {
  def unapply(z: List[Int]): Option[List[Int]] = z.reverse match {
    case 0x0D :: 0x0A :: tail => Some(tail.reverse)
    case _ => None
  }
}

object Message {
  def unapply(z: List[Int]): Option[List[Int]] = z match {
    case 0xFC :: EndToken(x) => Some(x)
    case _ => None
  }
}

object Main extends App {
  val x = List(0xFC, 0x03, 0x01, 0x02, 0x03, 0x0A, 0x0D)

  x match {
    case Message(Payload(payload)) => println (payload)
    case _ => println("No match")
  }
}

Что-то вроде:

object Message {
  def unapply(z: List[Int]): Option[List[Int]] = z match {
    case 0xFC :: Payload(x) :: 0x0A :: 0x0D => Some(x)
    case _ => None
  }
}

Но, конечно, :: ожидает элементы, а не списки, поэтому это не работает ...

6
задан Hugo Sereno Ferreira 27 October 2011 в 14:07
поделиться