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