为什么Option需要在for循环中显式显示toList?

时间:2012-12-20 05:58:39

标签: scala scala-option

使用带有简单选项的for循环有效:

scala> for (lst <- Some(List(1,2,3))) yield lst
res68: Option[List[Int]] = Some(List(1, 2, 3))

但循环选项的内容不会:

scala> for (lst <- Some(List(1,2,3)); x <- lst) yield x
<console>:8: error: type mismatch;
 found   : List[Int]
 required: Option[?]
              for (lst <- Some(List(1,2,3)); x <- lst) yield x
                                               ^

...除非将Option显式转换为List:

scala> for (lst <- Some(List(1,2,3)).toList; x <- lst) yield x
res66: List[Int] = List(1, 2, 3)

为什么需要显式列表转换?这是惯用的解决方案吗?

1 个答案:

答案 0 :(得分:12)

for (lst <- Some(List(1,2,3)); x <- lst) yield x

被翻译为

Some(List(1,2,3)).flatMap(lst => lst.map(x => x))

flatMap上的Option方法需要一个返回Option的函数,但是您传递的函数返回List并且没有隐式转换ListOption

现在,如果您首先将Option转换为列表,则会调用flatMap List方法来代替,这需要一个函数返回List,这是你传递给它的是什么。

在这种特殊情况下,我认为最惯用的解决方案是

Some(List(1,2,3)).flatten.toList