vam*_*olu 2 scala fold scala-option
使用案例
我有一个文件列表,这些文件可能具有或不具有有效的 mime 类型。在我的代码中,我使用选项来表示这一点。
我需要将 Seq[Option[T]] 转换为 Option[Seq[T]] ,以便在某些文件无效时我不会处理该列表。
错误
这是下面的实现中的错误:
found : (Option[Seq[A]], Option[A]) => Option[Seq[A]]
[error] required: (Option[Any], Option[Any]) => Option[Any]
[error] s.fold(init)(liftOptionItem[A])
Run Code Online (Sandbox Code Playgroud)
执行
def liftOptionItem[A](acc: Option[Seq[A]], itemOption: Option[A]): Option[Seq[A]] = {
{
acc match {
case None => None
case Some(items) =>
itemOption match {
case None => None
case Some(item) => Some(items ++ Seq(item))
}
}
}
}
def liftOption[A](s: Seq[Option[A]]): Option[Seq[A]] = {
s.fold(Some(Seq()))(liftOptionItem[A])
}
Run Code Online (Sandbox Code Playgroud)
此实现返回Option[Any]而不是Option[Seq[A]因为 的类型liftOptionItem[A]不适合。
如果您使用 TypeLevel Cats:
import cats.implicits._
List(Option(1), Option(2), Option(3)).traverse(identity)
Run Code Online (Sandbox Code Playgroud)
返回:
Option[List[Int]] = Some(List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
你必须使用List所以首先使用toList:
Seq(Option(1), Option(2), Option(3)).toList.traverse(identity).map(_.toSeq)
Run Code Online (Sandbox Code Playgroud)