Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 高阶尾部递归函数需要提前终止_Scala_Recursion_Tail Recursion_Higher Order Functions_Fold - Fatal编程技术网

Scala 高阶尾部递归函数需要提前终止

Scala 高阶尾部递归函数需要提前终止,scala,recursion,tail-recursion,higher-order-functions,fold,Scala,Recursion,Tail Recursion,Higher Order Functions,Fold,我不确定这个确切的案例以前是否处理过,所以现在开始 我有一个高阶尾部递归函数,它或多或少满足了我的需要。它将函数作为其参数之一 当前,如果函数返回一个left,我的递归函数将继续迭代 因此,我正在努力解决的是如何编写它,如果我的函数返回一个left,递归函数将停止迭代 def recusriveFunc[T](data: List[T])(acc: Acc)(f : (Acc, T) => Acc): Acc = { @tailrec def inner(acc: Ac

我不确定这个确切的案例以前是否处理过,所以现在开始

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

当前,如果函数返回一个left,我的递归函数将继续迭代

因此,我正在努力解决的是如何编写它,如果我的函数返回一个left,递归函数将停止迭代

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

假设
EitherAcc
或[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)
  }
}

假设
EitherAcc
或[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)
  }
}

看起来像可折叠的。猫的可折叠的。猫的可折叠的