Scala 中的提取器用于vs分配中的提取器

Scala 中的提取器用于vs分配中的提取器,scala,Scala,我对提取器有这种怀疑 如果我能做到这一点: val a :: b = List(1, 2, 3) 为什么我不能这样做: val c = for ( a :: b <- List(1, 2, 3) } yield a val c=for(a::b在Scala中,a对于yield表达式的翻译(不使用保护)是map函数。如果您尝试使用map,代码的怪癖似乎有点清楚: List(1, 2, 3).map((x: Int) => ???) 当您将映射到列表[+a]上时,您可以一次一个地投

我对提取器有这种怀疑

如果我能做到这一点:

val a :: b = List(1, 2, 3)
为什么我不能这样做:

val c = for ( a :: b <- List(1, 2, 3) } yield a

val c=for(a::b在Scala中,a
对于yield
表达式的翻译(不使用保护)是
map
函数。如果您尝试使用
map
,代码的怪癖似乎有点清楚:

List(1, 2, 3).map((x: Int) => ???)
当您将
映射到
列表[+a]
上时,您可以一次一个地投影每个值。在高阶函数中,您不能随意使用整个列表

相反,当在列表本身上使用模式匹配时,编译器会将您的第一个示例转换为(经过一些清理):


这是
列表[Int]
上的模式匹配,匹配头部和尾部的情况。对于规则模式匹配来说,这只是合成糖,对于产量来说,这是合成糖,对于
地图来说是一样的。它们只是做不同的事情。

在Yuval回答之后,我明白了为什么它不起作用

如果对第一个值感兴趣,则使用等效语法:

val first = for (a <- List(1, 2, 3).headOption) yield a

val first=for(a您希望
c
的值是多少?为什么首先需要
for
对于在集合上迭代,您只需要第一个元素。
val c=List(1,2,3).head
?如果您想在一个操作中同时获得head和tail,那么您的第一个模式匹配是有意义的,但是第二个模式匹配会删除
b
。我已经理解了,我需要它来处理查询json对象的复杂
序列。您在for中使用什么语法?@david.perez“什么语法”是什么意思?
val first = for (a <- List(1, 2, 3).headOption) yield a