为什么不一些(List(1,2,3))。flatten compile?

时间:2014-03-05 17:05:09

标签: scala monads scala-2.10

在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是什么?

2 个答案:

答案 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
相关问题