Я пытаюсь реализовать оптимизацию хвостового вызова, чтобы пересечь структуру линии дерева, используя стиль продолжения прохождения в scala. К сожалению, мой предыдущий опыт работы с fsharp не очень помогает. У меня есть рекурсивный вызов без оптимизации хвостового:Как добиться оптимизации хвостового вызова при перемещении древовидной структуры с использованием метода продолжения прохождения
def traverseTree(tree: Tree)(action: Int => Unit): Unit = {
def traverseTreeRec(tree: Tree, continuation:() => Unit, action: Int => Unit): Unit = tree match {
case Leaf(n) => {
action(n)
continuation()
}
case Node(n1, n2) => {
traverseTreeRec(n1,() => traverseTreeRec(n2, continuation, action), action)
}
}
traverseTreeRec(tree,() =>(), action)
}
Затем я пытаюсь переписать с помощью @annotation.tailrec
и TailCalls
, но до сих пор не уверен, что как украсить продолжение
def traverseTree(tree: Tree)(action: Int => Unit): Unit = {
@annotation.tailrec
def traverseTreeRec(tree: Tree, continuation:() => TailRec[Unit], action: Int => Unit): TailRec[Unit] = tree match {
case Leaf(n) => {
action(n)
continuation()
}
case Node(n1, n2) =>
// how to properly implement tail call here?
// ERROR: it contains a recursive call not in tail position
traverseTreeRec(n1,() => tailcall(traverseTreeRec(n2, continuation, action)), action)
}
traverseTreeRec(tree,() => done(), action)
}
Заранее спасибо
Следующий вопрос может быть полезным здесь: HTTP: //stackoverflow.com/questions/4428868/how-to-use-tailcalls –