List[Option[T]]
をに変換したいOption[List[T]]
。関数のシグネチャタイプは次のとおりです。
def lo2ol[T](lo: List[Option[T]]): Option[List[T]]
Some
予想される動作は、 sのみSome
を含むリストを要素の内部の要素のリストを含むリストにマップすることSome
です。一方、入力リストに少なくとも1つある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を使用しているが、 Scalazを使用していない、もう少し簡潔なバージョンPartialFunction.condOpt
:
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
}
}}