高阶尾递归函数需要尽早终止

时间:2018-11-02 14:32:30

标签: scala recursion tail-recursion higher-order-functions fold

不确定之前是否已经处理过这种确切的情况,所以去吧。

我有一个高阶尾递归函数,或多或少地满足了我的需要。它以函数作为参数之一。

当前,如果函数返回左,则我的递归函数将继续迭代。

所以,我正在努力的是如何以这样的方式编写它:如果我的函数返回左,则递归函数将停止迭代。

  def recusriveFunc[T](data: List[T])(acc: Acc)(f : (Acc, T) => Acc): Acc = {
    @tailrec
    def inner(acc: Acc, remaining: List[T]): Acc = {
      if (remaining.isEmpty)
        acc
      else {
        val newAcc: Acc = f(acc, remaining.head)
        inner(newAcc, remaining.tail)
      }
    }
        inner(acc, data)
  }

1 个答案:

答案 0 :(得分:2)

假设EitherAccEither[String, Unit],则可以在结束递归的条件下添加对失败测试acc.isLeft的检查:

def inner(acc: EitherAcc, remaining: List[T]): EitherAcc = {
  if (remaining.isEmpty || acc.isLeft)
  //                    \___________/ <- additional condition
    acc
  else {
    val newAcc: EitherAcc = f(acc, remaining.head)
    inner(newAcc, remaining.tail)
  }
}

另外,请注意,您可以使用isPos的{​​{1}}方法来表达filterOrElse函数:

Either