我想将List[Option[T]]
转换为Option[List[T]]
。函数的签名类型是使用Scalaz将选项列表转换为列表选项
def lo2ol[T](lo: List[Option[T]]): Option[List[T]]
预期的行为是映射仅包含Some
s转换为Some
含有的元素Some
的内部的元素的列表的列表。另一方面,如果输入列表中至少有一个None
,则预期行为仅返回None
。例如:
scala> lo2ol(Some(1) :: Some(2) :: Nil)
res10: Option[List[Int]] = Some(List(1, 2))
scala> lo2ol(Some(1) :: None :: Some(2) :: Nil)
res11: Option[List[Int]] = None
scala> lo2ol(Nil : List[Option[Int]])
res12: Option[List[Int]] = Some(List())
示例实现,没有scalaz,应该是:
def lo2ol[T](lo: List[Option[T]]): Option[List[T]] = {
lo.foldRight[Option[List[T]]](Some(Nil)){(o, ol) => (o, ol) match {
case (Some(x), Some(xs)) => Some(x :: xs);
case _ => None : Option[List[T]];
}}}
我记得看到什么地方有类似的例子,但使用Scalaz以简化代码。它会是什么样子?
稍微更简洁的版本,使用Scala2.8 PartialFunction.condOpt
,但仍然没有Scalaz:
import PartialFunction._
def lo2ol[T](lo: List[Option[T]]): Option[List[T]] = {
lo.foldRight[Option[List[T]]](Some(Nil)){(o, ol) => condOpt(o, ol) {
case (Some(x), Some(xs)) => x :: xs
}
}}
但是,如果您只需要'List [Option [A]]'的'Some'值,您就不需要'Option'了。您将拥有一个空列表或非空列表“A”。 – Apocalisp 2010-04-03 15:10:38
实际上,如果任何元素都是'None',我确实想要'None',所以'sequence'正是我所要求的。 我会尝试编辑问题以澄清要求。 – 2010-04-03 16:20:57
我无法使'lo.sequence'工作。使用scala-2.8.0.Beta1和scalaz-core_2.8.0.Beta1-5.0.1-SNAPSHOT.jar,如果我输入'def lo2ol [T](lo:List [Option [T]]):Option [List [ T]] = lo.sequence',我得到 ':10:error:diverging implicit expansion for type scalaz.Applicative [N]' –
2010-04-04 20:54:16