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