为什么我不能在Scala中从Option到List flatMap?

时间:2013-06-19 14:16:53

标签: scala functional-programming

当我尝试

Some(1).flatMap(_ => List(2))

我得到了

 error: type mismatch;
 found   : List[Int]
 required: Option[?]

但是Some(1).map(_ => List(2)).flatten正在运作。为什么我在第一种情况下会出现编译错误?

3 个答案:

答案 0 :(得分:5)

如果您确定列表中包含零个或一个元素,则可以执行此操作:

option.flatMap(_ => list.headOption)

答案 1 :(得分:4)

你不能这样做,因为类型系统禁止这样做。 Option.flatMap的类型是

     final def flatMap[B](f: (A) ⇒ Option[B]): Option[B] 

因此,您的函数必须返回Option类型,而不是List类型。

如果要转换为其他类型,则必须使用.map(...)。flatten

答案 2 :(得分:3)

不是说它不适用于其他Scala版本,但它对我不起作用:

scala> Some(1).map(_ => List(2)).flatten
<console>:8: error: Cannot prove that List[Int] <:< Option[B].
              Some(1).map(_ => List(2)).flatten
                                        ^

更重要的是,Some("abc").flatMap(s => s.toList)或其等效Some(List('a','b','c')).flatten的结果是什么?