我有一个接受函数f: Option[Seq[Option[A]]] => Option[A]]
case class Function[A](operator: Option[Seq[Option[A]]] => Option[A], name: String, arity: Int)
我希望这个类的用户能够不必担心Option
框架。因此,用户将传递函数g: Seq[A] => A
并在引擎盖下我将解除该功能。提升部件是我无法做到的。
这就是我所拥有的(使用scalaz optionInstance.lift
):
object Function {
def apply[A](operator: Seq[A] => A) = new Function(optionInstance.lift(operator),"a", 1)
}
但是由于电梯运营商正在返回Option[Seq[A]]
而不是Option[Seq[Option[A]]]
,因此无法编译。怎么办呢?
答案 0 :(得分:1)
以下是如何在两个原型之间进行转换的示例:
def f[A]: Seq[A] => A = ???
def g[A]: Option[Seq[Option[A]]] => Option[A] = {
{
case None => None
case Some(seq) if seq.exists(_.isEmpty) => None
case Some(seq) => Some(f(seq.flatten))
}
}
您可以使用它来转换运算符
答案 1 :(得分:1)
如果您想要返回选项[Seq [Option [A]]],您必须先进行Seq [A]转换为Seq [Option [A]],然后再进行升降