用于理解和局部映射的Scala

用于理解和局部映射的Scala,scala,for-comprehension,Scala,For Comprehension,Scala语言规范部分6.19说明: (p e0)的理解力A 所以 scala>val l:List[String,Int]]=List(左(“坏”),右(1)) l:List[String,Int]]=List(左(坏),右(1)) scala>for(Left(x)l.map{case Left(x)=>x} :13:警告:匹配并非详尽无遗! 缺少组合权 l、 map{案例左(x)=>x} ^ scala.MatchError:右(1) 在$anonfun$1.应用(:13) 在 为什么第

Scala语言规范部分6.19说明:

(p e0)的理解力A

所以

scala>val l:List[String,Int]]=List(左(“坏”),右(1))
l:List[String,Int]]=List(左(坏),右(1))
scala>for(Left(x)l.map{case Left(x)=>x}
:13:警告:匹配并非详尽无遗!
缺少组合权
l、 map{案例左(x)=>x}
^
scala.MatchError:右(1)
在$anonfun$1.应用(:13)
在

为什么第二个版本不起作用?或者更确切地说,为什么第一个版本起作用?

如果在
中使用模式匹配来理解
,编译器将实际插入一个调用
过滤器
,并在应用
映射之前检查
实例

编辑:

第6.19节还规定:


生成器pScala 2.7语言规范,第83页,底部第二段(此处没有2.8规范)。插入生成器模式匹配过滤器是理解翻译过程的第一步

有一个警告,上次我检查时,这对类型化模式不起作用,这可能会令人惊讶

for(x:Left <- l) yield x  

for(x:Left作为Eastsun备注的补充:Scala 2.8有一个collect方法,在您的示例中可以使用:

l.collect { case Left(x) => x }
//--> List[String] = List(Bad)

你能指出关于这一点的规范吗?我认为
filter
只适用于警卫:即
for(e 6.19对于理解和循环,翻译方案如下。在第一步中,每个生成器p false}然后,重复应用以下规则,直到消除所有理解。•a对于(p e0}的理解。使用l.collect{case Left(x)=>x}。它可以通过欺骗:val as=Seq(“a”,1,true,());对于(a@(dummy:Boolean),我在步骤1中使用了进行理解的方法,然后在步骤2中对进行理解的结果进行单独的收集。是否有任何方法可以在进行理解的过程中进行“收集”,以避免必须有两个“步骤”?
for(x:Left <- l) yield x  
l.collect { case Left(x) => x }
//--> List[String] = List(Bad)