2

我理解 for-expression 被翻译成 map 和 flatMap。但我发现了一些我无法解释的东西,需要你的帮助。以下是两个玩具示例:

for {
    None <- List(Option(1),None)
} yield 0

//res0: List[Int] = List(0, 0)

Q1:为什么 Some(1) 映射到 0 ?我期待列表(0),

update1:
​​感谢@marios 的评论,这更奇怪。
for(None <- List(Some(1), None) ) yield None返回List(Some(1), None)

update2:
有人说它是一个变量,但在 IDE 中,它确实链接到一个None对象。


我使用 IntelliJ 将上述 for 表达式自动翻译为 map 表达式:

List(Option(1), None).map { case None => 0 }  

//scala.MatchError: Some(1) 

Q2:这个映射表达式的错误是预期的,而第一个问题中的 for 表达式没有给我这个错误。为什么他们得到不同的计算?

4

2 回答 2

2
于 2016-02-06T13:59:58.300 回答
2

这两个返回相同的结果。

for(None <- List(Some(1), None) ) yield None
for(x <- List(Some(1), None) ) yield x

看来这None <-不是丢弃值的有效手段。相反,它只是创建一个掩蔽None对象的临时变量。

于 2016-02-06T05:47:07.900 回答