Scala中无法理解的理解结果

时间:2016-02-06 04:10:47

标签: scala functional-programming pattern-matching for-comprehension partialfunction

我理解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不会给我这个错误。为什么他们得到不同的计算?

2 个答案:

答案 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)