具有集合作为参数的scala提升函数

时间:2017-01-06 13:47:34

标签: scala scalaz scalaz7 lifting

我有一个接受函数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]]],因此无法编译。怎么办呢?

2 个答案:

答案 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]],然后再进行升降