为什么for-comprehension会反转输入列表?

时间:2015-02-01 03:59:48

标签: scala pattern-matching for-comprehension

我写过这个scala代码:

scala> val lists = List(1, 2, 3) :: List.empty :: List(5, 2) :: Nil
lists: List[List[Int]] = List(List(1, 2, 3), List(), List(5, 2))

scala> val x = for {
     | list @ head :: _ <- lists
     | } yield list.size
x: List[Int] = List(3, 2)

这可行,但输出是一个很大的混乱。这份清单是如何反转的?

我希望输出list @ head意味着List(1, 2) :: 3

但List(3,2)的输出有点无法解释。

1 个答案:

答案 0 :(得分:9)

列表没有反转,您将返回包含其他列表大小的列表。你的理解大致相当于:

lists.collect { case list @ head :: _ => list.size }

list @ head :: _仅匹配非空列表,list标识符是映射的整个List - 它将映射到其大小。因此,当空列表被丢弃时,大小列表将为List(3, 0, 2, 0),即List(3, 2)