我想将 aList[Option[T]]
转换为 a Option[List[T]]
。函数的签名类型是
def lo2ol[T](lo: List[Option[T]]): Option[List[T]]
预期的行为是将仅包含Some
s 的列表映射到Some
包含 elements 中的元素列表的列表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
}
}}