为什么我不能在Scala中将选项平面映射到列表?

为什么我不能在Scala中将选项平面映射到列表?,scala,functional-programming,Scala,Functional Programming,当我尝试 Some1.flatMap=>List2 我明白了 但是执行Some1.map=>List2.flatte是可行的。为什么在第一种情况下会出现编译错误?并不是说它在其他Scala版本上不起作用,但它对我不起作用: scala> Some(1).map(_ => List(2)).flatten <console>:8: error: Cannot prove that List[Int] <:< Option[B]. So

当我尝试

Some1.flatMap=>List2

我明白了


但是执行Some1.map=>List2.flatte是可行的。为什么在第一种情况下会出现编译错误?

并不是说它在其他Scala版本上不起作用,但它对我不起作用:

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

更重要的是,Someabc.flatMaps=>s.toList或其等效的SomeList'a'、'b'、'c'.flatte会产生什么结果?

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

     final def flatMap[B](f: (A) ⇒ Option[B]): Option[B] 
因此,函数必须返回选项类型,而不是列表类型


如果要转换为其他类型,则必须使用.map…展平

如果确定列表中有零个或一个元素,则可以执行以下操作:

option.flatMap(_ => list.headOption)
另一个简短的修复方法是使用Some1.flatMap=>Some2.toList,因为Option.flatMap必须返回一个OptionI期望的列表2,3,就像我使用scala 2.9.2映射一样
option.flatMap(_ => list.headOption)