为什么我不能在Scala中将选项平面映射到列表?
当我尝试 Some1.flatMap=>List2 我明白了为什么我不能在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.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)