我理解for-expression被翻译成map和flatMap。但我找到了一些我无法解释的东西,需要你的帮助。以下是两个玩具示例:
for {
None <- List(Option(1),None)
} yield 0
//res0: List[Int] = List(0, 0)
Q1:为什么有些(1)映射到0?我期待List(0),
UPDATE1:
感谢@marios的评论,一个更奇怪
for(None <- List(Some(1), None) ) yield None
返回List(Some(1), None)
。
UPDATE2:
有人说这是一个变量,但在IDE中,它确实链接到None
对象。
我使用IntelliJ将上面的for-expression自动翻译为map-expression:
List(Option(1), None).map { case None => 0 }
//scala.MatchError: Some(1)
Q2:此map-expression的错误是预期的,而第一个问题中的for-expression不会给我这个错误。为什么他们得到不同的计算?
答案 0 :(得分:2)
这两个返回相同的结果。
for(None <- List(Some(1), None) ) yield None
for(x <- List(Some(1), None) ) yield x
似乎None <-
不是丢弃价值的有效手段。相反,它只是创建一个掩盖None
对象的临时变量。
答案 1 :(得分:2)
这似乎是Scala编译器中的一个错误。 Scala Language Specification表示:“在第一步中,每个生成器p <- e
,其中p
对于e
的类型不可替代p <- e.withFilter { case p => true; case _ => false }
”,然后“对于(p <- e) yield e′
的理解被翻译为e.map { case p => e′ }
。”
这意味着您的示例for { None <- List(Option(1), None) } yield 0
应该转换为
List(Option(1),None).withFilter { case None => true; case _ => false }.map{case None => 0}
,按照您的预期评估为List(0)
。