递归部分应用程序,直到需要类型/结果

时间:2017-07-21 19:37:14

标签: scala

有没有办法编写一个函数(lst:List(T),fun :),它遍历lst并部分地将每个元素应用于fun并每次返回一个新函数并递归执行此操作直到函数的结果应用程序是:期望[T],而不是函数类型?

fun是一个curried函数

像这样。

def partialAppRec(lst : List[T], fun: ?) =
//pardon the non-exhaustive pattern match
  lst match {
  case x::xs =>
    val test = fun(x)
    if (test: Future[T]) return test
    partialAppRec(xs, (fun(x) _) )
}

但是什么类型会很有趣?无论如何说有趣:忽略它可能采取的参数。我希望能够接收fun变量参数但返回Future[T]f : ..=>Future[T]但我不确定这样的事情是否存在。

有任何提示/建议吗?谢谢。

1 个答案:

答案 0 :(得分:1)

Either怎么样?

 trait Fun[T] extends Function[T, Either[Fun[T], Future[T]]]
 object Fun {
   def apply[T](f: T => Either[Fun[T], Future[T]]) = 
     new Fun[T] { def apply(t: T) = f(t) }
}

 def partialAppRec[T](lst: List[T], fun: Fun[T]): Future[T] = lst match {
   case Nil => ???
   case head :: tail => fun(head) match {
     case Right(fu) => fu
     case Left(f) => partialAppRec(tail, f)
   }
 }