Хвостовая рекурсивная функция высшего порядка должна завершаться рано - PullRequest
0 голосов
/ 02 ноября 2018

Не уверен, что этот конкретный случай был рассмотрен ранее, поэтому здесь.

У меня есть хвостовая рекурсивная функция высшего порядка, которая более или менее делает то, что мне нужно. Он принимает функцию в качестве одного из аргументов.

В настоящее время, если функция возвращает влево, моя рекурсивная функция продолжит итерацию.

Итак, я борюсь с тем, как написать это так, чтобы, если моя функция вернула налево, рекурсивная функция перестала выполнять итерации.

  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 голосов
/ 02 ноября 2018

Предполагая, что 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)
  }
}

Также обратите внимание, что вы можете выразить функцию yout isPos с помощью метода filterOrElse из Either:

def isPos(ea: EitherAcc, t: Int): EitherAcc =
  ea.filterOrElse(_ => t > 0, s"$t is not positive")
...