scala提升函数,以集合作为参数

scala提升函数,以集合作为参数,scala,scalaz,scalaz7,lifting,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) 我希望这个类的用户不必担心选项框架。因此,用户将传递一个函数g:Seq[a]=>a,我将在引擎盖下提起该函数。提升部分是我不能做的 这就是我所拥有的(使用scalaz的optionInstance.l

我有一个类,它接受一个函数
f:Option[Seq[Option[a]]=>Option[a]]]

case class Function[A](operator: Option[Seq[Option[A]]] => Option[A], name: String, arity: Int)
我希望这个类的用户不必担心
选项
框架。因此,用户将传递一个函数
g:Seq[a]=>a
,我将在引擎盖下提起该函数。提升部分是我不能做的

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


但是,由于提升操作员返回的是
Option[Seq[A]]
而不是
Option[Seq[Option[A]]]
,因此无法编译。如何做到这一点?

以下是如何在两个原型之间转换的示例:

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

如果您想返回选项[Seq[Option[A]],您可以使用该选项转换您的操作员

,在执行提升之前,您必须首先将您的Seq[A]转换为Seq[Option[A]],我们不知道您希望如何进行映射。假设您有操作符Seq[A]=>A,如何处理提升Seq中的输入(部分(A),无))?我想不出一个规范的方法。如果
Seq(一些(a),无))
将评估为
None
作为一个合适的
选项[Seq[\u]]
必须表现正确?基本上用户将提供
Seq[a]=>a
,在引擎盖下,我将其提升到
选项[Seq[Option[a]]]=>Option[a]
。使用
Seq(Some(a),None))
评估到
None
说我有
def add(x:Seq[Double]):Double=x.reduce(u+)
我如何使用你的conversor?谢谢
  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))
    }
  }