在Scala 2.9.1中,我可以做到
> Some(List(1,2,3)).flatten
List(1,2,3)
但是在Scala 2.10.0中,
> Some(List(1,2,3)).flatten
Cannot prove that Seq[Int] <:< Option[B]
我发现this已关闭错误,但我不明白判决,或者为什么关闭判决。
(1)为什么这不适用于Scala 2.10(显然是设计?)
(2)我的2.9代码的惯用语2.10是什么?
答案 0 :(得分:9)
flatten
采用外部容器的类型。您无法将List
放入Option
,因此无效。相反,首先更改外部容器的类型,以便可以进行展平:
Some(List(1,2,3)).toList.flatten
答案 1 :(得分:3)
flatten
实际上只打算在一个monad上工作。也就是说,它将M[M[T]]
转换为M[T]
,就像在List(List(1,2),List(3)).flatten => List(1,2,3)
中一样。 scala.Predef
提示将Option[T]
强制转换为List[T]
,但不是相反。虽然将Option视为零个或一个元素的列表是合理的,但是对于具有两个或更多元素的列表没有一般模式。
然而,为方便起见,支持另一种方式:
List(Some(1),None,Some(2),Some(3)).flatten => List(1, 2, 3)
编辑:我想念。它不是对Option的隐式转换,这使得这成为可能,而是Option
可遍历。在the api docs中,List
的{{1}}实际上是:
flatten