1

我有一个接受函数的类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,并且在后台我会提升该函数。起重部分是我无法做到的。

这就是我所拥有的(使用optionInstance.liftscalaz):

object Function {
  def apply[A](operator: Seq[A] => A) = new Function(optionInstance.lift(operator),"a", 1)
}

但是,这不会编译,因为电梯操作员正在返回Option[Seq[A]]而不是Option[Seq[Option[A]]]. 如何才能做到这一点?

4

2 回答 2

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))
    }
  }

您可以使用它来转换您的运营商

于 2017-01-06T14:41:28.493 回答
1

如果您想返回 Option[Seq[Option[A]]],您必须先将您的 Seq[A] 转换为 Seq[Option[A]],然后再进行提升

于 2017-01-06T15:23:16.967 回答