对于表示自然数的数据类型:
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 代数的路线。
编辑:看起来这可能是直接相关的:是否可以使用延续来使 foldRight 尾递归?