0

当我尝试

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

我明白了

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

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

4

3 回答 3

5

如果您确定列表中有零个或一个元素,您可以这样做:

option.flatMap(_ => list.headOption)
于 2013-06-19T21:35:00.093 回答
4

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

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

所以你的函数必须返回一个 Option 类型,而不是 List 类型。

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

于 2013-06-19T15:16:08.013 回答
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什么?

于 2013-06-19T14:41:48.387 回答