不确定之前是否已经处理过这种确切的情况,所以去吧。
我有一个高阶尾递归函数,或多或少地满足了我的需要。它以函数作为参数之一。
当前,如果函数返回左,则我的递归函数将继续迭代。
所以,我正在努力的是如何以这样的方式编写它:如果我的函数返回左,则递归函数将停止迭代。
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)
}
答案 0 :(得分:2)
假设EitherAcc
是Either[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