Scala 高阶尾部递归函数需要提前终止
我不确定这个确切的案例以前是否处理过,所以现在开始 我有一个高阶尾部递归函数,它或多或少满足了我的需要。它将函数作为其参数之一 当前,如果函数返回一个left,我的递归函数将继续迭代 因此,我正在努力解决的是如何编写它,如果我的函数返回一个left,递归函数将停止迭代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
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)
}
}
看起来像可折叠的。猫的可折叠的。猫的可折叠的