Работа с None
в случае, если выписка является причиной для возврата Option[Seq[Any]] type
вместо Option[Seq[A]] type
.Нам нужно заставить функцию liftOptionItem[A]
вернуть Option[Seq[Any]] type
.И ошибка компиляции может быть исправлена следующими изменениями в обеих функциях. (Поскольку fold
не идет в каком-либо конкретном порядке, существуют ограничения на start value
и, таким образом, return value
, foldLeft
используется ввместо fold
.)
def liftOptionItem[A](acc: Option[Seq[Any]], itemOption: Option[A]): Option[Seq[Any]] = {
{
acc match {
case None => Some(Nil)
case Some(items)=>
itemOption match {
case None => Some(items ++ Seq("None"))
case Some(item) => Some(items ++ Seq(item))
}
}
}
}
def liftOption[A](s: Seq[Option[A]]): Option[Seq[Any]] = {
s.foldLeft(Option(Seq[Any]()))(liftOptionItem[A])
}
Теперь код компилируется.
В Scala REPL:
scala> val list1 = Seq(None,Some(21),None,Some(0),Some(43),None)
list1: Seq[Option[Int]] = List(None, Some(21), None, Some(0), Some(43), None)
scala> liftOption(list1)
res2: Option[Seq[Any]] = Some(List(None, 21, None, 0, 43, None))
scala> val list2 = Seq(None,Some("String1"),None,Some("String2"),Some("String3"),None)
list2: Seq[Option[String]] = List(None, Some(String1), None, Some(String2), Some(String3), None)
scala> liftOption(list2)
res3: Option[Seq[Any]] = Some(List(None, String1, None, String2, String3, None))