2015-05-29 2 views
2

Я получаю следующее по следующей list в scalaPattern Matching для списка списка в Scala

val x : List[List[Int]] = List(List(1,2,3,4,5), List(6,7,8,9,10)) 
     x match { 
      case x::xs => { 
       println ("First Part => " + x) 
       println ("Second Part => " + xs) 
      } 
     } 

Это выводит следующие

First Part => List(1, 2, 3, 4, 5) 
Second Part => List(List(6, 7, 8, 9, 10)) 

Почему вторая часть не только List(6, 7, 8, 9, 10), почему list of list

ответ

6

Поскольку шаблон x :: xs разбивает исходный список входных данных List(List(1,2,3,4,5), List(6,7,8,9,10)) в голове и в хвосте списка.

Глава списка является первым элементом в списке. Что в этом случае List(1,2,3,4,5).

Хвост списка - это первоначальный список, за исключением первого элемента. Таким образом, это список всех элементов, кроме первого элемента. В этом случае после головки есть только один элемент, который равен List(6,7,8,9,10). Хвост - это список, содержащий этот элемент, поэтому хвост List(List(6,7,8,9,10)).

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

case x1 :: x2 :: Nil => { 
    println ("First Part => " + x1) 
    println ("Second Part => " + x2) 
} 

Обратите внимание, что это будет соответствовать только список ввода с ровно два элементов.

1

case x::xs совпадение для head::tail

По определению, головка является единственным элементом, в то время как хвост будет остальная часть последовательности. Поскольку ваши элементы являются списками, head - это List, а хвост по-прежнему является списком List - хотя ваш исходный список, x содержит всего два элемента, поэтому остальные tail - всего лишь один элемент, тип остается.