Для типа данных, представляющая натуральных числа:Эффективная реализация катаморфизма в Scala
sealed trait Nat
case object Z extends Nat
case class S(pred: Nat) extends Nat
В Scala, здесь есть элементарный способ реализации соответствующего catamorphism:
def cata[A](z: A)(l: Nat)(f: A => A): A = l match {
case Z => z
case S(xs) => f(cata(z)(xs)(f))
}
Однако, поскольку рекурсивная вызов cata не находится в хвостовом положении, это может легко вызвать переполнение стека.
Какие альтернативные варианты реализации могут избежать этого? Я бы предпочел не идти по маршруту F-algebras, если интерфейс, представленный в конечном счете кодом, не может выглядеть так же просто, как выше.
EDIT: Похоже, что это может иметь непосредственное отношение: Is it possible to use continuations to make foldRight tail recursive?
Не должен был комментировать подобный, но какой черт .. «интересный вопрос». Ждем ответа. – javadba