为什么 for-comprehension 会反转输入列表?
Why does for-comprehension reverse the input list?
我写了这段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) 的输出有点无法解释。
列表没有反转,您返回的列表包含其他列表的大小。你的理解大概是这样的:
lists.collect { case list @ head :: _ => list.size }
list @ head :: _
只匹配非空列表,list
标识符是整个 List
被映射——它被映射到它的大小。因此,当空列表被丢弃时,大小列表将是 List(3, 0, 2, 0)
,即 List(3, 2)
。
我写了这段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) 的输出有点无法解释。
列表没有反转,您返回的列表包含其他列表的大小。你的理解大概是这样的:
lists.collect { case list @ head :: _ => list.size }
list @ head :: _
只匹配非空列表,list
标识符是整个 List
被映射——它被映射到它的大小。因此,当空列表被丢弃时,大小列表将是 List(3, 0, 2, 0)
,即 List(3, 2)
。