首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任务中用于vs提取器的提取器

任务中用于vs提取器的提取器
EN

Stack Overflow用户
提问于 2016-10-27 09:00:47
回答 2查看 64关注 0票数 1

我对萃取器有这个疑问。

如果我能做到的话:

代码语言:javascript
复制
val a :: b = List(1, 2, 3)

为什么我不能这样做:

代码语言:javascript
复制
val c = for ( a :: b <- List(1, 2, 3) } yield a
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-27 09:10:24

for-yield表达式在Scala中的转换(不使用警卫)是map函数。如果您尝试使用map,那么代码的奇怪之处似乎就有点清楚了:

代码语言:javascript
复制
List(1, 2, 3).map((x: Int) => ???)

当您在一个map上进行List[+A]时,您将逐个投影每个值。在高阶函数中,你没有在你的可支配范围内拥有完整的列表。

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

代码语言:javascript
复制
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的产量相同.他们只是做不同的事情。

票数 2
EN

Stack Overflow用户

发布于 2016-10-27 09:18:48

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

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

代码语言:javascript
复制
val first = for (a <- List(1, 2, 3).headOption) yield a
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40280402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档