2015-08-14 2 views
2

Учитывая следующие sealed trait:Неполный Pattern Match Предупреждение с Кортежем

scala> sealed trait Parent 
defined trait Parent 

scala> case object Boy extends Parent 
defined object Boy 

scala> case object Girl extends Parent 
defined object Girl 

И дал xs:

scala> val xs: (Parent, (Seq[Int], Seq[Int])) = (Boy, (Nil, Nil)) 
xs: (Parent, (Seq[Int], Seq[Int])) = (Boy,(List(),List())) 

scala> xs match { 
    | case (Boy, (Nil, Nil))  => 1 
    | case (Boy, (ys, a :: as)) => 2 
    | case (Boy, (ys, Nil))  => 3 
    | case (Girl, (Nil, Nil)) => 4 
    | case (Girl, (a :: as, ys)) => 5 
    | case (Girl, (Nil, ys))  => 6 
    | } 
<console>:15: warning: match may not be exhaustive. 
It would fail on the following inputs: (Boy, _), (Girl, _) 
     xs match { 
    ^
res1: Int = 1 

Я не понимаю, это неисчерпаемое предупреждения матча. Что делать (Boy, _) и (Girl, _) означает?

Я не уверен, что у (Seq[Int], Seq[Int]) может быть любой другой матч, чем у меня с правой стороны.

+0

Короткий ответ: '::' является экстрактором для 'List'. Вам нужно 'Seq' для извлечения' Seq 's. –

ответ

2

Я не уверен, почему, но кажется, что у Scala есть проблемы с unapply (или это apply) для Seq, который является магией, которая делает возможным сопоставление шаблонов. По-видимому, cons в ваших матчах является проблемой с Seq. Если изменений ваших хзов использовать List, он будет работать:

val xs: (Parent, (List[Int], List[Int])) = (Boy, (Nil, Nil)) 

EDIT:

Это может быть, что вы можете использовать Seq, но только должны шаблон матч на строительстве немного по-другому, например:

xs match { 
    case (Boy, (Nil, Nil)) => 1 
    case (Boy, (_, Seq(x, _))) => 2 
    case (Boy, (_, Nil)) => 3 
    case (Girl, (Nil, Nil)) => 4 
    case (Girl, (Seq(x, _), _)) => 5 
    case (Girl, (Nil, _)) => 6 
    } 
+0

Разве это не имеет смысла? Не все непустые 'Seq' являются экземплярами '::'. –

+0

Мне тоже понравился этот ответ - http://stackoverflow.com/questions/11503033/what-is-the-idiomatic-way-to-pattern-match-sequence-comprehensions –