我对萃取器有这个疑问。
如果我能做到的话:
val a :: b = List(1, 2, 3)为什么我不能这样做:
val c = for ( a :: b <- List(1, 2, 3) } yield a发布于 2016-10-27 09:10:24
for-yield表达式在Scala中的转换(不使用警卫)是map函数。如果您尝试使用map,那么代码的奇怪之处似乎就有点清楚了:
List(1, 2, 3).map((x: Int) => ???)当您在一个map上进行List[+A]时,您将逐个投影每个值。在高阶函数中,你没有在你的可支配范围内拥有完整的列表。
相反,当对列表本身使用模式匹配时,编译器会将第一个示例转换为(经过一些清理后):
def main(args: Array[String]): Unit = {
private[this] val x$1: (Int, List[Int]) = List(1, 2, 3) match {
case (head: Int, tl: List[Int])scala.collection.immutable.::[Int]((a @ _), (b @ _)) => Tuple2[Int, List[Int]](a, b)
};
val a: Int = x$1._1;
val b: List[Int] = x$1._2;
()这是List[Int]上的模式匹配,匹配头和尾的情况。它只是用于规则模式匹配的同步糖,与map的产量相同.他们只是做不同的事情。
发布于 2016-10-27 09:18:48
在Yuval回答之后,我已经明白为什么它不起作用了。
如果对第一个值感兴趣,则等效语法:
val first = for (a <- List(1, 2, 3).headOption) yield ahttps://stackoverflow.com/questions/40280402
复制相似问题